
두 개의 열이 있는 텍스트 파일이 있는데 두 열 모두에 있는 문자열만 인쇄하고 싶습니다. 예를 들어:
column1 column2
stringA stringZ
stringP stringT
stringZ stringX
stringE stringR
stringT stringG
예상 출력:
stringZ
stringT
답변1
몇 가지 개선 사항을 포함하여 @cherdt에서 뻔뻔하게 도난당했습니다(유사한 프로세스 교체를 위한 유사한 쉘 zsh
또는 지원이 있다고 가정 ).bash
ksh
f=filename; comm -12 <(cut -f1 < "$f" |sort) <(cut -f2 < "$f" | sort)
- 파일 이름을 변수에 저장하면 중복되지 않는 데 도움이 됩니다.
- 파일에 쓴 다음 비교할 필요가 없습니다. 일반적으로 파일을 쓰려면 나중에 정리하기 위해 삭제해야 합니다. 하지만 대용량 파일에는 이렇게 하지 마세요. 프로세스 대체를 사용하면 실제로 임시 파일로 리디렉션할
comm
때 파일에서 읽는 것처럼 보입니다 .stdout
fd
답변2
다른 awk 솔루션을 사용하고 단순해지세요
awk 'NR==FNR{seencol1[$1]++;next} ($2 in seencol1)' infile.txt infile.txt
산출,
stringZ
stringT
답변3
을 사용하여 두 파일을 비교할 수 comm
있으므로 먼저 각 열에 대해 정렬된 파일을 생성합니다.
cat filename | cut -f1 | sort > column1
cat filename | cut -f2 | sort > column2
그런 다음 처음 2개 열을 억제하여 comm
두 파일 모두에 데이터가 있는 행만 표시합니다.
comm -12 col1 col2
답변4
awk 'NF!=1{cola[$1]++; colb[$2]++} END { for (item in cola ) { if( colb[item]>0 ) { print item } }' /path/to/input