특정 열에 중복 데이터를 표시하고 원래 행 번호를 제공하는 간단한 명령을 만들려고 합니다.
파일 예:
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
GNU sort
및 GNU를 사용하면 uniq
다음을 수행할 수 있습니다.
$ <FILE.txt awk -F';' '{print NR"- "$3}' | sort -st' ' -k2 | uniq -Df1
2- POLICE
4- POLICE
행은 먼저 텍스트의 어휘 순서에 따라 정렬된 다음 숫자순으로 정렬됩니다( -s
유사하게 정렬된 텍스트의 원래 순서 유지). | sort -n
줄 번호별로 정렬하려면 하나를 추가하세요 .
단독으로 사용 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
한 다음 파일에서 세 번째 필드( ;
필드 구분 기호로 사용됨)의 패턴이 포함된 줄을 검색합니다. 일치하는 줄의 경우 줄 번호와 세 번째 필드(대시로 구분)가 인쇄됩니다.