保留重复的第一个实例

Bob*_*Bob 5 bash duplicate awk shell-script text-processing

我有一个包含多列的文件,并且已经确定了使用 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
Run Code Online (Sandbox Code Playgroud)

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

我想保存唯一记录和重复记录的第一个实例,在对这些 dups 进行排序后,它们已在第 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
Run Code Online (Sandbox Code Playgroud)

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

到目前为止我的代码是:

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
Run Code Online (Sandbox Code Playgroud)

我无法做的是获取每个副本的第一个实例并将其保存在 newfile 中,但我在上面的代码中仍然有错误。

请帮忙。

iru*_*var 5

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
Run Code Online (Sandbox Code Playgroud)