1, 2, 3열을 기준으로 2개의 파일을 병합하고 싶습니다. 다음 명령을 시도했지만 awk
작동하지 않습니다.
awk 'NR==FNR {h[$1FS$2FS$3]=$4; next}{k=$1FS$2FS$3; if (k in h) print $1,$2,$3,$4,h[k] ;else print $1,$2,$3,$4,"NA"}1' FS=\| OFS=\| file2.txt
파일 1.txt:
Student1|Class 1A|27|20140804 08:16:54
Student2|Class 1B|15|20140804 10:10:10
Student3|Class 1C|17|20140804 15:02:14
Student4|Class 1D|20|20140804 18:02:14
Student5|Class 2D|10|20140804 20:02:14
파일 2.txt:
Student1|Class 1A|27|20140805 08:16:54
Student2|Class 1B|15|20140805 10:10:10
Student4|Class 1D|20|20140805 18:02:14
Student5|Class 2D|10|20140805 20:02:14
예상되는 결과:
Student1|Class 1A|27|20140804 08:16:54|20140805 08:16:54
Student2|Class 1B|15|20140804 10:10:10|20140805 10:10:10
Student3|Class 1C|17|20140804 15:02:14|NA
Student4|Class 1D|20|20140804 18:02:14|20140805 18:02:14
Student5|Class 2D|10|20140804 20:02:14|20140805 20:02:14
답변1
이 시도. 귀하의 예와 같이 배열을 만들고 병합된 필드만 인쇄하십시오 END { ... }
.
$ awk -F\| '{ k=$1 FS $2 FS $3; h[k] = (k in h) ? h[k]=h[k] FS $4 : $0 } END { for(x in h){printf "%s%s\n",h[x],(length(h[x])>38) ? "" : "|NA"}}' file1.txt file2.txt|sort
Student1|Class 1A|27|20140804 08:16:54|20140805 08:16:54
Student2|Class 1B|15|20140804 10:10:10|20140805 10:10:10
Student3|Class 1C|17|20140804 15:02:14|NA
Student4|Class 1D|20|20140804 18:02:14|20140805 18:02:14
Student5|Class 2D|10|20140804 20:02:14|20140805 20:02:14
$
답변2
첫 번째 파일에 전체 키 목록(예: 학생)이 포함되어 있다고 가정하는 것이 안전하다면 먼저 각 레코드에 추가할 수 있습니다. 그런 다음 동안에는 END
다음이 필요합니다.유형키를 사용하여 추가 값을 자르고 누락된 값을 다음으로 채웁니다 "NA"
.
$ awk -F\| '{k=$1 FS $2 FS $3;r[k]=r[k] FS $4;c[k]++}
END{n=asorti(r,s);
for(i=1;i<=n;i++){
print s[i] substr(r[s[i]],1) (++c[s[i]] == ARGC ? "" : FS "NA")
}
}' file1.txt file2.txt
Student1|Class 1A|27|20140804 08:16:54|20140805 08:16:54
Student2|Class 1B|15|20140804 10:10:10|20140805 10:10:10
Student3|Class 1C|17|20140804 15:02:14|NA
Student4|Class 1D|20|20140804 18:02:14|20140805 18:02:14
Student5|Class 2D|10|20140804 20:02:14|20140805 20:02:14
나는 백필 비교를 수행하기 위해 파일 수 + 1(즉, 명령 자체) 을 사용하도록 지시하는 ++c[s[i]] == ARGC
를 사용하고 있습니다.ARGC
awk
답변3
나는 그것을 시도하고 작동합니다
/usr/xpg4/bin/awk 'NR==FNR {h[$1,$2,$3]=$4; next}{print $0,($1,$2,$3) in h?h[$1,$2,$3]:"NA"}' FS=\| OFS=\| file2.txt file1.txt