最初の冗長インスタンスを保持

最初の冗長インスタンスを保持

複数の列を含むファイルがあり、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

2つの重複値インスタンスを表示できます。他の列の値(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

私ができないことは、各レプリカの最初のインスタンスをインポートして新しいファイルに保存することです。しかし、上記のコードにはまだエラーがあります。

助けてください。

答え1

sortそれ自体は十分です。まず、行がフィールド範囲で「グループ化」されるようにソートされ、3-6各グループ内のレコードはフィールド合計に基づいてさらに5ソートされます1sort -u最後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つのフィールドの重複エントリの最初のインスタンスが保持されます。

関連情報