Xlsxファイル(110725x9マトリックス)が1つあり、Unixがxlsxファイルに役立つかどうかわからないため、タイプテキスト(タブを削除)として保存しました。重複行は常に行ごとに連続しています。
たとえば、次のようなテキストファイルがあるとします。 3,4-th、7,8-th、および17,18-th行が同じであることがわかります。常に下ではなく、上の重複行を削除したいです。
2009,37214611872 2009 135 20 17,1 17,4 19,2 21,8 24,1
2009,37237442922 2009 135 22 16,5 14,5 12,6 11,2 10,5
2009,37260273973 2009 136 0 7,7 7,2 7,1 7,3 7,5
2009,37260273973 2009 136 0 7,7 7,2 7,0 7,2 7,4
2009,37488584475 2009 136 20 14,6 15,1 16,4 18,3 20,1
2009,37511415525 2009 136 22 15,9 14,6 12,8 10,9 9,4
2009,37534246575 2009 137 0 8,2 6,9 6,2 6,2 6,4
2009,37534246575 2009 137 0 8,1 6,8 6,1 6,0 6,3
2009,37557077626 2009 137 2 6,8 6,7 6,5 6,3 6,2
2009,37579908676 2009 137 4 5,8 5,6 5,4 5,4 5,7
2009,37602739726 2009 137 6 6,3 6,1 5,9 5,8 5,8
2009,37625570776 2009 137 8 4,5 5,2 6,0 6,6 7,2
2009,37648401826 2009 137 10 9,6 9,0 8,4 8,4 9,1
2009,37671232877 2009 137 12 11,4 11,7 12,4 13,4 14,4
2009,37694063927 2009 137 14 12,4 13,1 14,2 15,4 16,7
2009,37785388128 2009 137 22 15,5 14,0 12,2 10,3 8,7
2009,37808219178 2009 138 0 6,3 5,8 5,5 5,5 5,8
2009,37808219178 2009 138 0 6,2 5,7 5, 4 5,4 5,7
したがって、出力は次のようになります。
2009,37214611872 2009 135 20 17,1 17,4 19,2 21,8 24,1
2009,37237442922 2009 135 22 16,5 14,5 12,6 11,2 10,5
2009,37260273973 2009 136 0 7,7 7,2 7,0 7,2 7,4
2009,37488584475 2009 136 20 14,6 15,1 16,4 18,3 20,1
2009,37511415525 2009 136 22 15,9 14,6 12,8 10,9 9,4
2009,37534246575 2009 137 0 8,1 6,8 6,1 6,0 6,3
2009,37557077626 2009 137 2 6,8 6,7 6,5 6,3 6,2
2009,37579908676 2009 137 4 5,8 5,6 5,4 5,4 5,7
2009,37602739726 2009 137 6 6,3 6,1 5,9 5,8 5,8
2009,37625570776 2009 137 8 4,5 5,2 6,0 6,6 7,2
2009,37648401826 2009 137 10 9,6 9,0 8,4 8,4 9,1
2009,37671232877 2009 137 12 11,4 11,7 12,4 13,4 14,4
2009,37694063927 2009 137 14 12,4 13,1 14,2 15,4 16,7
2009,37785388128 2009 137 22 15,5 14,0 12,2 10,3 8,7
2009,37808219178 2009 138 0 6,2 5,7 5, 4 5,4 5,7
ソートせずにそれを行うにはどうすればよいですか?
単一の列に基づいて重複を削除するには、awk
を使用できます。
awk '!seen[$1]++' input-file > output-file
この説明は this Unix&Linux post で見ることができます。
古い行の削除はより複雑です。複製が常に一緒になると、次のことができます。
awk 'prev && ($1 != prev) {print seen[prev]} {seen[$1] = $0; prev = $1} END {print seen[$1]}' input-file > output-file
ここで、中央のブロックで、{seen[$1] = $0}
は現在の行($0
)を最初のフィールド($1
)をインデックスとしてseen
配列に保存し、最初のフィールドを保存しますprev
変数内。このprev
は、次の行を処理するときに最初のブロックで使用されます。
最初のブロックでは、prev
が設定され(2行目以降のみtrue)、currentと等しくないかどうかを確認します最初のフィールド(ここではprev
は前の行の処理中に設定されました)。そうでない場合は、過去の重複を移動し、前の行を印刷できます。 END
で、最後の行についてもこれを繰り返します。