複数の列を含むファイルがあり、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
ソートされます1
。sort -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つのフィールドの重複エントリの最初のインスタンスが保持されます。