bash:选择max timestamp按行分组或合并行

bash:选择max timestamp按行分组或合并行,bash,sorting,merge,group-by,max,Bash,Sorting,Merge,Group By,Max,我有这样一个输入: A 05 something B 03 something1 A 02 something43 A 01 somethingelse C 03 something2 B 10 something C 01 somethingagain 我想输出: A 05 something B 10 something C 03 something2 即我按第一个字段分组,并选择最大的数字。在我的例子中,这个数字是一个固定长度的时间戳,因此可以使用字母排序来获得最大的时间戳。我更喜欢用

我有这样一个输入:

A 05 something
B 03 something1
A 02 something43
A 01 somethingelse
C 03 something2
B 10 something
C 01 somethingagain
我想输出:

A 05 something
B 10 something
C 03 something2

即我按第一个字段分组,并选择最大的数字。在我的例子中,这个数字是一个固定长度的时间戳,因此可以使用字母排序来获得最大的时间戳。我更喜欢用一些命令行工具来完成它,我想它可以用一些简单的方法来完成,但直到现在还没有成功。请不要使用正则表达式,可读性越强越好:)

您可以使用awk将结果存储在数组中:

cat input | awk '{if (a[$1] < $2) a[$1]=$2;} END {for (i in a) print i, a[i];}' 
只需排序两次:

< input sort -rk2,2 | sort -k1,1 -u

第一个排序按第二列排序(
-r
表示反向),第二个排序按第一列和唯一性(
-u
)排序。

您可以按反向升序排序第二个字段,按升序排序第一个字段,并使用awk仅打印键列的第一个值:

sort -k1,1 -k2r,2 input.txt | awk '{ if (! F[$1]) print; F[$1]=1  }'

如果awk脚本还没有看到第一列中的键,它将打印整行。然后它会记住第一列中的键,这样如果再次看到它就不会被打印。

我不知怎的得到了Idea,但它不会输出OP想要的内容。@FlorinGhita:它对我有用。也许你需要设置
LC_ALL=C
来取消区域设置?嗯,没有成功。尝试使用LC_ALL=C和LC_ALL=en_US,但返回的是01 B 03 C03@FlorinGhita:听起来像是缺少
-r
。第一次排序返回:B 10 A 05 C 03 B 03 A 02 A 01如果您有大量输入,这将是最快的,因为它不进行排序。但是,如果输入是huuuge(许多GB),我不确定它是如何管理内存的。
sort -k1,1 -k2r,2 input.txt | awk '{ if (! F[$1]) print; F[$1]=1  }'