k1과 k2라는 두 개의 파일이 있고 공통 키 "책 제목"을 기반으로 이 두 파일을 병합하려고 합니다.
k1
John | Dreaming of Day | IEEEJournal
Akon | Dreaming of Night | ACMJournal
k2
Dreaming of Day | Fiction
Dreaming of Night | Non-Fiction
kout: 책 제목에 따라 병합되어야 합니다. 즉 Dreaming of Day
,Dreaming of Night
John | Fiction | IEEEJournal
Akon | Non-Fiction | ACMJournal
나는 다음 awk 스크립트를 작성했습니다:
awk -F"|" 'BEGIN{OFS="|"}FNR==NR{a[$1$2]=$3;next}($1$2 in a && $3=$3"|"a[$1$2])' k1 k2
그러나 이것은 작동하지 않는 것 같습니다.
답변1
이것은 gawk
다음 에서 작동하는 것 같습니다 mawk
.
awk -F' *[|] *' -vOFS=' | ' '
NR==FNR {a[$1]=$2;next} $2 in a {print $1, a[$2], $3}
' k2 k1
John | Fiction | IEEEJournal
Akon | Non-Fiction | ACMJournal
답변2
작동하지 않는 이유는 파일 1의 필드 2가 파일 2의 필드 1과 같지 않기 때문이라고 생각합니다. "|"를 구분 기호로 사용하면 파일 2의 필드 1은 "Dreaming of Day"이고 파일 1의 필드 2는 "Dreaming of Day"입니다. "꿈"이라는 단어 앞에는 여분의 공백이 있습니다.
Join 명령을 사용하여 예제를 실행해 보았지만 추가 공간으로 인해 작동하지 않습니다. 필드 2 - 파일 1에서 추가 공간을 제거하거나 필드 1 - 파일 2에 추가 공간을 추가하면 작동합니다.
PS1: 그런데, 조인을 사용하면(그리고 추가 공백을 제거함으로써) "스크립팅" 없이도 원하는 결과에 매우 근접할 수 있습니다.
join --nocheck-order -t"|" -1 2 a.txt b.txt
출력(모든 | 앞에 있는 추가 공백을 모두 제거한 후):
Dreaming of Day |John |IEEEJournal|Fiction
Dreaming of Night |Akon |ACMJournal|Non-Fiction
그런 다음 -d'|'필수 필드를 잘라낼 수 있습니다
PS2: 데이터에 적합한 "고전적인 방법"이 항상 있습니다(추가 공간을 삭제할 필요 없음).
while IFS="|" read -r line title1 rest; do
title2=$(echo $title1)
genre=$(grep -e "$title2" b.txt |cut -f2 -d"|")
echo $line "|" $genre "|" $rest
done <a.txt
산출:
John | Fiction | IEEEJournal
Akon | Non-Fiction | ACMJournal