私は次のような巨大なリストを持っています
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
3より前の2の後に、より多くの重複数を検索したいと思います。
最初の行の数字はで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つ以上の入力ファイルをコマンドライン引数として提供できます(複数のファイルは単一のファイルとしてリンクされていると見なされます)。
BEGINルールは汎用の改行を設定し(つまり、MS-DOSから以前のMac、Unixまでのすべての改行規則を受け入れます)、セミコロンを;
フィールド区切り文字として使用します。説明のために、フィールド区切り文字は周囲のすべてのスペースを使用して3つのフィールド(、、および)x;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で始まるようにフォーマットされています。