假设我有这个 输入 文件 49142202.txt
:
A 5
B 6
C 3
A 4
B 2
C 1
是否可以按照第2列的值对第1列中的组进行排序?期望的输出如下:
B 6 <-- B group at the top, because 6 is larger than 5 and 3
B 2 <-- 2 less than 6
A 5 <-- A group in the middle, because 5 is smaller than 6 and larger than 3
A 4 <-- 4 less than 5
C 3 <-- C group at the bottom, because 3 is smaller than 6 and 5
C 1 <-- 1 less than 3
这是我的解决方案:
join -t$'\t' -1 2 -2 1 \
<(cat 49142202.txt | sort -k2nr,2 | sort --stable -k1,1 -u | sort -k2nr,2 \
| cut -f1 | nl | tr -d " " | sort -k2,2) \
<(cat 49142202.txt | sort -k1,1 -k2nr,2) \
| sort --stable -k2n,2 | cut -f1,3
< p>按照第二列排序后,传递给join
的第一个输入是:
2 A
1 B
3 C
< p > join
的第二个输入按列1排序为:
A 5
A 4
B 6
B 2
C 3
C 1
join
的输出为:
A 2 5
A 2 4
B 1 6
B 1 2
C 3 3
C 3 1
然后按第二列中的“nl”行号进行排序,然后使用“cut”保留原始输入的第1列和第3列。
我知道使用Python的pandas库中的groupby
可以更轻松地完成这个任务,但是是否有更优雅的方法,同时仍然使用GNU Coreutils,例如sort
、join
、cut
、tr
和nl
?最好能避免使用内存效率低下的awk
解决方案,但也请分享这些方案。谢谢!
cat 49142202.txt | sort -k2nr,2
是非常非常非常糟糕的做法,不需要在第一个命令中使用 cat。在两个命令中都是如此!!!https://superuser.com/questions/192052/advantages-of-cating-file-and-piping-to-grep - Allan