awk의 정확한 패턴 일치

awk의 정확한 패턴 일치

아래와 같이 listA가 있습니다.

gene1
gene2
gene11
gene22
gene23

또한 네 번째 열이 목록의 유전자와 일치하는 탭으로 구분된 텍스트 파일(*hist.txt)도 있습니다. 탭으로 구분된 텍스트 파일에서 listA의 각 유전자 값을 추출하고 싶습니다.

이게 내가 쓴 거야

for i in `cat listA.txt`
do
    for a in *hist.txt
    do
        fn=${a%%_*}
        cat $a | awk -v OFS="\t" -v fn="$fn" -v pattern="$i" '$4 ~ pattern{print fn,$0}' >> ${i}_out.txt
    done
done

정확한 패턴 일치가 없으면 awk에서 패턴 일치가 실패합니다. gene1의 출력에는 gene11도 포함됩니다.

답변1

매우 모호하므로 이 문맥에서 "패턴"이라는 단어를 사용하지 마십시오. 무엇을 의미하든 항상 "문자열" 또는 "정규 표현식"을 사용하십시오(참조패턴과 일치하는 텍스트를 찾는 방법더 많은 정보를 알고 싶다면).

전체 문자열 일치를 수행하려는 것처럼 들리지만 정규식 연산자( ~)와 경계 없는 동적 정규식( pattern)을 사용하므로 질문이 있습니다.

주변 쉘 루프를 제거하려면 awk에 다음 한 번의 호출을 사용하십시오.

awk '
    BEGIN { FS=OFS="\t" }
    NR==FNR { genes[$1]; next }
    FNR==1 { fn=FILENAME; sub(/_.*/,"",fn) }
    $4 in genes { out=$4"_out.txt"; print fn, $0 >> out; close(out) }
' listA.txt *hist.txt

관련 정보