"cut -d"の後にファイルの行番号を表示します。 "-f3 | uniq -d"

"cut -d"の後にファイルの行番号を表示します。 "-f3 | uniq -d"

特定の列に重複データを表示し、元の行番号を提供する簡単なコマンドを作成しようとしています。

ファイルの例:

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番目のフィールド(ダッシュで区切られた)が印刷されます。

関連情報