두 개의 파일 이 있습니다 A.tsv
.B.tsv
A.tsv(필드 구분 기호 = \t
):
Sample ID Internal Control Result Consensus
4686427 Pass Not Detected Not Available
4666275 Pass Detected Not Available
4666295 Pass Detected Available
4644444 Pass Detected Available
B.tsv(필드 구분 기호 = \t
):
seqName clade substitutions deletions
4666295 A8A yes no
4666275 18A no yes
4686427 161 no yes
이 두 파일을 다음과 같이 새 파일로 병합하고 싶습니다.
Sample ID Internal Control Result Consensus clade substitutions deletions
4686427 Pass Not Detected Not Available 161 no yes
4666275 Pass Detected Not Available 18A no yes
4666295 Pass Detected Available A8A yes no
4644444 Pass Detected Available
이것을 작성했지만 헤더나 두 번째 파일의 첫 번째 줄이 인쇄되지 않습니다.
awk -F '\t' -v OFS="\t" 'NR==FNR{a[$1]=$0;next}{print $0,a[$1]}' B.tsv A.tsv > C.tsv
그렇다면 올바르게 수행하는 방법은 무엇입니까? 감사해요
추신: 파일을 서브샘플링했는데 실제 파일은 행과 열 측면에서 더 큽니다.
답변1
노력하다:
awk 'BEGIN { FS=OFS="\t" }
NR==FNR { seq=$1; sub(/[^\t]*\t/,""); if(NR==1)hdr=$0; hold[seq]=$0; next }
FNR==1 { print $0, hdr; next }
($1 in hold) { print $0, hold[$1]; next }
{ print }' fileB fileA >fileC
답변2
$ cat tst.awk
BEGIN { FS=OFS="\t" }
{ key = (FNR>1 ? $1 : RS) }
NR == FNR {
$1 = ""
map[key] = $0
next
}
{ print $0 map[key] }
$ awk -f tst.awk B.tsv A.tsv
Sample ID Internal Control Result Consensus clade substitutions deletions
4686427 Pass Not Detected Not Available 161 no yes
4666275 Pass Detected Not Available 18A no yes
4666295 Pass Detected Available A8A yes no
4644444 Pass Detected Available
$ awk -f tst.awk B.tsv A.tsv | column -s$'\t' -t
Sample ID Internal Control Result Consensus clade substitutions deletions
4686427 Pass Not Detected Not Available 161 no yes
4666275 Pass Detected Not Available 18A no yes
4666295 Pass Detected Available A8A yes no
4644444 Pass Detected Available