아래와 같이 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