
特定の列に重複データを表示し、元の行番号を提供する簡単なコマンドを作成しようとしています。
ファイルの例:
JENNIE;30;DOCTOR;F
SARA;26;POLICE;F
EDWARD;32;TEACHER;M
ROBERT;44;POLICE;M
次のコマンドを使用すると、列3で重複した内容を取得できます。
cat FILE.txt |cut -d ";" -f3 | sort | uniq -d
問題は、結果の元の行番号を取得する必要があることです。
私のコマンドは以下を示しています:
POLICE
POLICE
欲しい
2- POLICE
4- POLICE
答え1
GNUsort
とGNUを使用すると、uniq
次のことができます。
$ <FILE.txt awk -F';' '{print NR"- "$3}' | sort -st' ' -k2 | uniq -Df1
2- POLICE
4- POLICE
行は最初にテキストの語彙順に並べ替えられ、次に数字順に並べ替えられます(-s
同様に並べ替えられたテキストの元の順序を保持)。| sort -n
行番号で並べ替えるには、1つを追加してください。
単独で使用awk
:
awk -F';' '!x {c[$3]++}; x && c[$3] > 1 {print FNR"- "$3}' FILE.txt x=1 FILE.txt
答え2
現在、パイプラインはあなたが主張したように動作するようには思えませんが、BSDまたはGNUツールでは動作しません。他のツールを使用したかどうかはわかりません。
あなたが要求したことを達成するために、次のループを思いつくことができました。
for prof in $(cut -d\; -f3 FILE.txt | sort | uniq -d); do
awk -v pat="$prof" -F\; '$3 ~ pat{print NR"-",$3}' FILE.txt
done
これにより、複数回発生するジョブのリストが生成され、このリストはファイル内のawk
各ジョブの発生を検索するために使用され、行番号とジョブ名が印刷されます。
awk は、パイプラインから収集されたキー項目をパラメータcut -d\; -f3 FILE.txt | sort | uniq -d
に設定pat
し、ファイル内の 3 番目のフィールド (;
フィールド区切り文字として使用) のパターンを含む行を検索します。一致する行の場合、行番号と3番目のフィールド(ダッシュで区切られた)が印刷されます。