두 개의 파일이 있습니다.
$ cat File1
A
B
C
$ cat File2
A aaa B
D bbb A
B aaa h
File1
에서 패턴을 검색하고 싶습니다 File2
. 이것이 가능한 방법이지만 에서 grep -f File1 File2
보고된 패턴 만 검색합니다.File1
$1
File2
예제 출력:
$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
직접 사용하기 위한 정규식으로 변환하여 올바른 패턴을 생성하는 것입니다(앞에 곡절 부호가 있고 뒤에 접미사가 붙습니다 File2
File
something
^something[[:blank:]]
[[:blank:]]
).
곡절은 패턴을 줄의 시작 부분에 고정하고 [[:blank:]]
공백이나 탭과 일치하도록 강제합니다.
GNU는 grep
표준 입력에서 패턴을 읽을 수도 있습니다.
$ awk '{ printf("^%s[[:blank:]]\n", $0) }' File1 | grep -f - File2
A aaa B
B aaa h
원하는 경우 이 awk
명령을 동등한 명령으로 바꿀 수 있습니다 .sed
sed
awk
$ sed -e 's/^/^/' -e 's/$/[[:blank:]]/' File1 | grep -f - File2