특정 열에서 원하는 값 중 하나가 포함된 행을 가져오는 방법이 있나요? 예를 들어 이런 파일이 있다면
12 a 4
11 f 5
8 b 6
10 x 7
값 목록을 포함하는 또 다른 파일입니다.
a
b
x
두 번째 열에 있는 파일 2의 값 중 하나가 있는 파일 1의 행만 가져오는 방법이 있습니까? 이 예와 마찬가지로 출력은 다음과 같아야 합니다.
12 a 4
8 b 6
10 x 7
미리 감사드립니다. 내 파일은 탭으로 구분되어 있습니다.
답변1
주어진
$ cat file1
12 a 4
11 f 5
8 b 6
10 x 7
그리고
$ cat file2
a
b
x
짧은 AWK 스크립트를 사용할 수 있습니다.
$ awk 'FNR == NR {strings[$0]} NR > FNR && ($2 in strings)' ./file2 ./file1
12 a 4
8 b 6
10 x 7
첫 번째 패턴( FNR == NR
)은 (명령줄의 첫 번째 파일 인수)에만 적용됩니다 file2
. 해당 작업은 인덱스가 일치하는 문자열인 연관 배열을 채웁니다.
두 번째 패턴( NR > FNR && ($2 in strings)
)은 file1
명령줄에서 따를 수 있는 다른 파일의 줄에만 적용됩니다.만약에두 번째 열은 배열의 인덱스입니다 strings
. 해당 작업은 생략되며 기본값은 입니다 print
.
발견된 문자열에 공백도 포함되도록 하려면 의 열이 file1
단일 로 구분되어 있다고 가정하고 호출에 (또는 ) 옵션을 추가 <tab>
하면 됩니다 .-v FS='\t'
-F '\t'
awk
답변2
이것을 사용하십시오 :
grep -wf file2 file1
f
파일 2의 내용을 일치시키고 w
파일 2의 내용과 일치하는 전체 단어만 파일 1의 내용과 일치하도록 보장 하므로 aa
및 및 같은 ab
문자열 apple
은 일치하지 않습니다.
GNU grep을 사용하여 확인하세요.
답변3
의 3개 필드 file1.txt
와 다음의 단일 문자 일치 file2.txt
:
chars="$( tr -d "\n" <file2.txt)"
regexp="\t[$chars]\t"
eval grep -E "$regexp" file1.txt
테스트되지 않은