고유 열에서 행을 얻는 방법은 무엇입니까?

고유 열에서 행을 얻는 방법은 무엇입니까?

다음 줄이 포함된 ASCII 파일(Report.dat)이 있습니다.

a  ./L1/file2.txt
c  ./L1/file1.txt
b  ./L2/file1.txt
a  ./L2/file2.txt

다음과 같이 첫 번째 열의 고유한 행만 가져와야 합니다.

c  ./L1/file1.txt
b  ./L2/file1.txt

AWK, sort 또는 uniq 명령을 사용하여 이 작업을 어떻게 수행할 수 있나요?

답변1

고유한 "태그"를 얻는 방법은 다음과 같습니다.

$ awk '{ print $1 }' Report.dat | sort | uniq -u
b
c

^다음을 추가하여 문자열을 줄의 시작 부분과 일치하는 정규식으로 변환할 수 있습니다.

$ awk '{ print $1 }' Report.dat | sort | uniq -u | sed 's/^/^/'
^b
^c

다음 정규식을 원본 파일에 적용하여 해당 줄을 얻을 수 있습니다.

$ awk '{ print $1 }' Report.dat | sort | uniq -u | sed 's/^/^/' | grep -f /dev/stdin Report.dat
c  ./L1/file1.txt
b  ./L2/file1.txt

우리 는 에서 정규식을 가져와 이를 사용하여 일치를 수행하라는 grep -f /dev/stdin지시를 받았습니다 .grepsedReport.dat


또는 이 sed단계를 건너뛰세요.

awk '{ print "^" $1 }' Report.dat | sort | uniq -u | grep -f /dev/stdin Report.dat

또는 다음에서 모든 작업을 수행할 수 있습니다 awk.

awk 'NR == FNR { c[$1]++; next } c[$1] == 1' Report.dat Report.dat

파일을 두 번 읽습니다. 처음에는 단순히 각 "태그"의 발생 횟수를 계산합니다. 두 번째로, 해당 라인을 인쇄하기 전에 현재 라인의 레이블을 테스트하여 해당 라인의 개수가 1인지 확인합니다.

파일을 두 번 구문 분석할 수 없습니다. 전체 파일을 메모리에 저장하고 거기에서 두 번 구문 분석할 수 있지만 이는 지루하고 문제가 발생합니다.정상적인 상황에서스크립트를 입력하려는 파일의 크기가 얼마나 큰지 알 수 없는 경우.

관련 정보