Bash

保留重複的第一個實例

  • September 16, 2015

我有一個包含多列的文件,並且已經確定了使用 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+)在 2 行之間可能不同,因此我需要查看這兩個實例。

我想保存唯一記錄,並且在對這些重複進行排序後,重複記錄的第一個實例已按第 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

我無法做的是獲取每個副本的第一個實例並將其保存在 newfile 中,我仍然在上面的程式碼中有錯誤。

請幫忙。

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

如果我理解正確,這應該足夠了:

$ 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-last 欄位的第一個實例。

引用自:https://unix.stackexchange.com/questions/230040