file1에서 file2까지 grep 패턴 열

file1에서 file2까지 grep 패턴 열

두 개의 파일이 있습니다.

$ cat File1
A
B
C
$ cat File2
A aaa B
D bbb A
B aaa h

File1에서 패턴을 검색하고 싶습니다 File2. 이것이 가능한 방법이지만 에서 grep -f File1 File2보고된 패턴 만 검색합니다.File1$1File2

예제 출력:

$cat File3
A aaa B
B aaa h

답변1

그리고 awk:

awk 'NR==FNR{a[$0]=NR; next} a[$1]' f1.txt f2.txt
  • NR==FNR{a[$0]=NR; next}: 첫 번째 파일( f1.txt)의 경우 레코드를 연관 배열의 키로 갖고 해당 레코드 번호를 값으로 갖습니다.

  • a[$1]: 두 번째 파일( f2.txt)의 경우 첫 번째 필드가 배열의 키인 경우에만 레코드를 인쇄합니다.a

예:

% cat f1.txt                                       
A
B
C

% cat f2.txt                                       
A aaa B
D bbb A
B aaa h

% awk 'NR==FNR{a[$0]=NR; next} a[$1]' f1.txt f2.txt
A aaa B
B aaa h

답변2

사용 join명령:

join <(sort file1) <(sort file2)

파일이 정렬된 경우.

join file1 file2

답변3

bash프로세스 대체를 이해하는 쉘을 사용하십시오 .

$ grep -f <( awk '{ printf("^%s[[:blank:]]\n", $0) }' File1 ) File2
A aaa B
B aaa h

여기서의 아이디어는 from 의 각 줄을 grep -f File1직접 사용하기 위한 정규식으로 변환하여 올바른 패턴을 생성하는 것입니다(앞에 곡절 부호가 있고 뒤에 접미사가 붙습니다 File2Filesomething^something[[:blank:]][[:blank:]]).

곡절은 패턴을 줄의 시작 부분에 고정하고 [[:blank:]]공백이나 탭과 일치하도록 강제합니다.

GNU는 grep표준 입력에서 패턴을 읽을 수도 있습니다.

$ awk '{ printf("^%s[[:blank:]]\n", $0) }' File1 | grep -f - File2
A aaa B
B aaa h

원하는 경우 이 awk명령을 동등한 명령으로 바꿀 수 있습니다 .sedsedawk

$ sed -e 's/^/^/' -e 's/$/[[:blank:]]/' File1 | grep -f - File2

관련 정보