특정 열에서 원하는 값 중 하나가 포함된 행을 가져오는 방법은 무엇입니까?

특정 열에서 원하는 값 중 하나가 포함된 행을 가져오는 방법은 무엇입니까?

특정 열에서 원하는 값 중 하나가 포함된 행을 가져오는 방법이 있나요? 예를 들어 이런 파일이 있다면

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

테스트되지 않은

관련 정보