두 개의 별도 열에 있는 경우 문자열을 인쇄합니다.

두 개의 별도 열에 있는 경우 문자열을 인쇄합니다.

두 개의 열이 있는 텍스트 파일이 있는데 두 열 모두에 있는 문자열만 인쇄하고 싶습니다. 예를 들어:

column1       column2

stringA       stringZ
stringP       stringT
stringZ       stringX
stringE       stringR
stringT       stringG

예상 출력:

stringZ
stringT

답변1

몇 가지 개선 사항을 포함하여 @cherdt에서 뻔뻔하게 도난당했습니다(유사한 프로세스 교체를 위한 유사한 쉘 zsh또는 지원이 있다고 가정 ).bashksh

f=filename; comm -12 <(cut -f1 < "$f" |sort) <(cut -f2 < "$f" | sort)
  • 파일 이름을 변수에 저장하면 중복되지 않는 데 도움이 됩니다.
  • 파일에 쓴 다음 비교할 필요가 없습니다. 일반적으로 파일을 쓰려면 나중에 정리하기 위해 삭제해야 합니다. 하지만 대용량 파일에는 이렇게 하지 마세요. 프로세스 대체를 사용하면 실제로 임시 파일로 리디렉션할 comm때 파일에서 읽는 것처럼 보입니다 .stdoutfd

답변2

다른 awk 솔루션을 사용하고 단순해지세요

awk 'NR==FNR{seencol1[$1]++;next} ($2 in seencol1)' infile.txt infile.txt 

산출,

stringZ
stringT

답변3

을 사용하여 두 파일을 비교할 수 comm있으므로 먼저 각 열에 대해 정렬된 파일을 생성합니다.

  1. cat filename | cut -f1 | sort > column1
  2. 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

관련 정보