awk를 사용하여 2개의 파일 병합

awk를 사용하여 2개의 파일 병합

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를 사용하고 있습니다.ARGCawk

답변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

관련 정보