gpt4 book ai didi

bash - unix 按关联的最大值对组进行排序?

转载 作者:行者123 更新时间:2023-11-29 09:12:40 25 4
gpt4 key购买 nike

假设我有这个输入文件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

按第 2 列排序的 join 的第一个输入是这样的:

2   A
1 B
3 C

按第 1 列排序的 join 的第二个输入是这样的:

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

然后在第 2 列中按 nl 行号排序,然后使用 cut 保留原始输入的第 1 和第 3 列。

我知道使用例如 groupby 可以轻松得多Python 的 Pandas ,但是有没有更优雅的方式来做到这一点,同时坚持使用 GNU Coreutils例如sort , join , cut , trnl ?最好我想避免内存效率低下的 awk 解决方案,但也请分享这些解决方案。谢谢!

最佳答案

如评论中所述,我的解决方案试图减少 pipes 的数量, 不必要 cat命令,尤其是管道数量 sort操作,因为排序是一个复杂/耗时的操作:

我找到了以下解决方案,其中 f_grp_sort是输入文件:

for elem in $(sort -k2nr f_grp_sort | awk '!seen[$1]++{print $1}')
do
grep $elem <(sort -k2nr f_grp_sort)
done

输出:

B       6
B 2
A 5
A 4
C 3
C 1

解释:

sort -k2nr f_grp_sort将生成以下输出:

B       6
A 5
A 4
C 3
B 2
C 1

sort -k2nr f_grp_sort | awk '!seen[$1]++{print $1}'将生成输出:

B
A
C

awk只会以相同的顺序生成临时输出第一列的 1 个唯一元素。

然后 for elem in $(...)do grep $elem <(sort -k2nr f_grp_sort); donegrep对于包含 B 的行然后A , 然后 C什么将提供所需的输出。

现在作为增强功能,您可以使用临时文件来避免执行 sort -k2nr f_grp_sort操作两次:

$ sort -k2nr f_grp_sort > tmp_sorted_file && for elem in $(awk '!seen[$1]++{print $1}' tmp_sorted_file); do grep $elem tmp_sorted_file; done && rm tmp_sorted_file

关于bash - unix 按关联的最大值对组进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49142202/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com