保留第一个重复项实例

保留第一个重复项实例

我有一个包含多列的文件,并已识别出使用 bash 脚本复制特定列值(第 3-6 列)的行。

输入示例:

A B C D E F G
1 2 T TACA A 3 2 Q
3 4 I R 8 2 Q
9 3 A C 9 3 P
8 3 I R 8 2 Q

我可以显示重复值的两个实例。两行之间的其他列值(第 1、2 和 7+ 列)可能不同,因此我需要查看两个实例。

我想保存唯一记录,并且在对这些重复项进行排序后,重复记录的第一个实例已按第 5 列(任何顺序都可以)排序,然后按第 1 列(降序排列 --> 首先是最大值)。

期望的输出:

A B C D E F G
1 2 T TACA A 3 2 Q
9 3 A C 9 3 P
8 3 I R 8 2 Q

注意:最终输出的顺序并不重要,因为稍后会进行排序。确保所需的行存在才是最重要的。

到目前为止我的代码是:

tot=$(awk 'n=x[$3,$6]{print n"\n"$0;} {x[$3,$6]=$0;}' oldfilename | wc -l)  #counts duplicated records and saves overall count as $tot
if [ $tot == "0" ] 
then
    awk '{print}' oldfilename >> newfilename  #if no dups found, all lines saved in new file
else if
    awk '(!(n=x[$3,$6]{print n"\n"$0;} {x[$3,$6]=$0;})' oldfilename >> newfilename  #if dups found, unique lines in old file saved in new file
else
    awk 'n=x[$3,$6]{print n"\n"$0;} {x[$3,$6]=$0;}' oldfilename > tempfile  #save dups in tempfile
    sort -k1,1, -k5,5 tempfile  #sort tempfile on cols 1 then 5 (want descending order)                  
fi

我无法做的是获取每个重复项的第一个实例并将其保存在新文件中,但上述代码中仍然存在错误。

请帮忙。

答案1

sort本身就应该足够了。首先排序,使行按字段范围“分组” 3-6,每组内的记录进一步按字段5和排序1。通过管道将其传递给sort -uon 3-6,这将禁用最后手段比较并返回每个3-6组中的第一条记录。最后,通过管道将其传输到sort,这次是通过字段51

sort -k3,6 -k5,5r -k1,1r file | sort -k3,6 -u | sort -k5,5r -k1,1r
A B C D E F G
1 2 T TACA A 3 2 Q
9 3 A C 9 3 P
8 3 I R 8 2 Q

答案2

如果我理解正确的话,这应该足够了:

$ sort input | uniq -f 2
1 2 T TACA A 3 2 Q
3 4 I R 8 2 Q
9 3 A C 9 3 P
A B C D E F G

-f 2开关指示uniq跳过比较前 2 个字段。因此,它将保留任何重复的最后 3 个字段的第一个实例。

相关内容