
私は巨大なリストを持っています
67603;4716-5469-1335-0870;5450-7938-7992-5530;14523593;03 Oct 2016 - 17:01:15
63123;5592-6762-4853-6320;4532-4142-5613-9690;1441407;03 Oct 2016 - 17:01:15
62562;4532-5581-3790-0140;5292-4905-4356-2840;28898987;03 Oct 2016 - 17:01:15
68080;5188-1564-9611-7580;4556-9998-5999-3300;2262361;03 Oct 2016 - 17:01:15
2番目以降と3番目より前の重複番号をさらに検索したい
最初の行の番号は5450-7938-7992-5530
、次の行の番号4532-4142-5613-9690
などです。
答え1
次の awk スクリプトを考えてみましょうduplicates.awk
。
#!/usr/bin/awk -f
BEGIN {
RS = "(\r\n|\n\r|\r|\n)"
FS = "[\t\v\f ]*;[\t\v\f ]*"
split("", count)
}
{
count[$3]++
}
END {
for (item in count) {
if (count[item] > 1)
printf "%s\n", item
}
}
たとえば を使用して、実行可能にすることを忘れないでくださいchmod a+rx duplicates.awk
。入力をコマンドにパイプするか、コマンドライン パラメータとして 1 つ以上の入力ファイルを指定することができます (複数のファイルは 1 つのファイルに連結されているかのように扱われます)。
BEGIN ルールは、ユニバーサル改行 (つまり、MS-DOS から古い Mac、Unix までのすべての改行規則を受け入れます) と、;
フィールド区切り文字としてのセミコロンを設定します。説明のために、フィールド区切り文字が周囲の空白も消費するようにしたので、、、 の3x;foo bar ; y
つのフィールドに解析されます。x
foo bar
y
レコード ルール (スニペットの中央部分) は、入力内のすべてのレコード (行) に適用されます。awk は連想配列をサポートしているため、3 番目のフィールド (文字列) をcount
配列のキーとして使用し、そのエントリを 1 ずつ増やします。(awk で存在しない配列エントリを増やすと 1 になるため、最初の増分は 1 になり、コードは期待どおりに動作します。)
END ルールはcount
配列をスキャンし、少なくとも 2 回出現したエントリを出力します。この出力はランダムな順序であることに注意してください。(出現回数に応じて出力をソートする方法や、ファイル内の元の順序 (最初の出現) を維持する方法もありますが、OP は順序に関する要件について何も言及していないため、気にしませんでした。定義されていない順序は実装が最も簡単です。)
たとえば、出現回数の後に文字列 (3 列目の値) を印刷する場合は、代わりに次の END ルールを使用します。
END {
for (item in count)
printf "%15d %s\n", count[item], item
}
出力は、出力の最初の 15 文字が数値用に予約され、値が 17 番目の文字から始まるようにフォーマットされます。
答え2
stack.txt ファイルに重複する値をいくつか作成し、出力を印刷します -
67603;4716-5469-1335-0870;5450-7938-7992-5530;14523593;03 Oct 2016 - 17:01:15
63123;5592-6762-4853-6320;4532-4142-5613-9690;1441407;03 Oct 2016 - 17:01:15
62562;4532-5581-3790-0140;5292-4905-4356-2840;28898987;03 Oct 2016 - 17:01:15
68080;5188-1564-9611-7580;4556-9998-5999-3300;2262361;03 Oct 2016 - 17:01:15
67603;4716-5469-1335-0870;5450-7938-7992-5530;14523593;03 Oct 2016 - 17:01:15
63123;5592-6762-4853-6320;4532-4142-5613-9690;1441407;03 Oct 2016 - 17:01:15
62562;4532-5581-3790-0140;5292-4905-4356-2840;28898987;03 Oct 2016 - 17:01:15
68080;5188-1564-9611-7580;4556-9998-5999-3300;2262361;03 Oct 2016 - 17:01:15
67603;4716-5469-1335-0870;5450-7938-7992-5530;14523593;03 Oct 2016 - 17:01:15
63123;5592-6762-4853-6320;4532-4142-5613-9690;1441407;03 Oct 2016 - 17:01:15
以下のコマンドを使用します -
awk 'BEGIN{FS=";"}{a[$3]++} END {for(k in a) print a[k],k}' stack.txt
出力 -
3 4532-4142-5613-9690
2 5292-4905-4356-2840
3 5450-7938-7992-5530
2 4556-9998-5999-3300