다음 두 파일이 있다고 가정해 보겠습니다.
1.
Locus_1 univ
Locus_2 anc
Locus_3 cat
2.
university GO:000001
impromptu GO:000002
advanced GO:000003
inheritance GO:000004
파일 #2에 있는 파일 #1의 $2에 대해 grep -f를 수행하고 싶지만 첫 번째 파일의 줄과 파일 #1의 $2와 일치하는 파일 #2의 전체 줄도 검색하고 싶습니다.
기본적으로 내 출력이 다음과 같기를 원합니다.
Locus_1 univ university GO:000001
Locus_2 anc advanced GO:000003
어떻게 해야 하나요? 루프를 사용하여 첫 번째 파일을 한 줄씩 구문 분석 for
한 다음 해당 줄을 변수에 저장할 수 있다고 생각했지만 성공하지 못했습니다.
저는 Windows에서 Cygwin 쉘을 사용하고 있습니다.
답변1
이를 파일에 저장 patterns.awk
하고 을 호출합니다. awk -f patterns.awk patterns data
여기서 patterns
첫 번째 파일은 어디에 있고 data
두 번째 파일은 다음과 같습니다.
NR == FNR {
prefix[NR] = $0;
pattern[NR] = $2;
count++;
next;
}
{
for (i = 1; i <= count; i++) {
if (index($1, pattern[i]) > 0) {
print prefix[i] " " $0;
next;
}
}
}
작동 방식은 다음과 같습니다. 스키마 파일을 읽을 때 첫 번째 규칙이 사용됩니다. 즉, 총 레코드 수가 파일의 레코드 수와 동일하다는 것입니다. 검색할 라인과 패턴을 두 개의 배열에 저장하고 계속 진행합니다. 두 번째 규칙은 총 레코드 수가 파일의 레코드 수를 초과할 때, 즉 데이터 파일을 읽을 때 사용됩니다. 행의 첫 번째 열과 일치하는 패턴이 있는지 확인합니다. 그렇다면 패턴 파일에서 일치하는 줄을 인쇄한 다음 데이터 파일에서 일치하는 줄을 인쇄합니다.