分组来自'最后' bash的价值

时间:2016-09-24 08:39:45

标签: bash

我有一个两栏文件:

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中执行此操作?

4 个答案:

答案 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