我有一个包含多列的文件,并已识别出使用 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 -u
on 3-6
,这将禁用最后手段比较并返回每个3-6
组中的第一条记录。最后,通过管道将其传输到sort
,这次是通过字段5
和1
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 个字段的第一个实例。