web-dev-qa-db-ja.com

最初の列で重複を見つけて、行全体について削除するにはどうすればよいですか?

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

ソートせずにそれを行うにはどうすればよいですか?

4
Suat Yazıcı

単一の列に基づいて重複を削除するには、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で、最後の行についてもこれを繰り返します。

8
muru