我有一个两栏文件:
1,112
1,123
2,123
2,124
2,144
3,158
4,123
4,158
5,123
我需要知道每个column1的最后一个column2值:
1,123
2,144
3,158
4,158
5,123
如何在bash
中执行此操作?
答案 0 :(得分:4)
一些解决方案:
1)使用tac
来反转输入文件和sort
$ tac ip.txt | sort -u -t, -k1,1n
1,123
2,144
3,158
4,158
5,123
2)perl
$ perl -F, -ne '$h{$F[0]} = $_; END{print $h{$_} foreach (sort {$a <=> $b} keys %h)}' ip.txt
1,123
2,144
3,158
4,158
5,123
在,
上分割的输入行和哈希变量会根据第一个字段不断更新,如果第一个字段匹配,则会有效地丢弃前一行。最后,基于排序键
感谢@choroba指出在两种情况下都需要数字排序
答案 1 :(得分:2)
您可以使用<link href='https://fifamadness.github.io/host/css/global.css' rel='stylesheet'/>
上的awk分隔符将,
存储在数组中,使用密钥$2
:
$1
答案 2 :(得分:1)
这与@Sundeep的解决方案非常相似,但在此处:
checked
即。仅使用基于第一个字符的$ tac file|uniq -w 1|tac
1,123
2,144
3,158
4,158
5,123
,cat
输出反转记录顺序,然后再次颠倒顺序。
答案 3 :(得分:1)
使用GNU bash:
declare -A array # associative array
# read from file
while IFS=, read a b; do array[$a]="$b"; done < file
# print array
for i in "${!array[@]}"; do echo "$i,${array[$i]}"; done
输出:
1,123 2,144 3,158 4,158 5,123