"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

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한 다음 파일에서 세 번째 필드( ;필드 구분 기호로 사용됨)의 패턴이 포함된 줄을 검색합니다. 일치하는 줄의 경우 줄 번호와 세 번째 필드(대시로 구분)가 인쇄됩니다.

관련 정보