두 개의 Unix 파일 병합

두 개의 Unix 파일 병합

파이프로 구분된 2개의 파일(예: file1과 file2)이 있습니다. 그 중 file1은 33개의 컬럼을 갖고, file2는 34/35/36개의 컬럼을 가질 수 있습니다. 따라서 우리가 가지고 있는 열 수에 대해 생각하지 맙시다.
제가 하고 싶은 것은 file1과 file2(1열부터 32열까지)의 값을 비교하는 것입니다. 모든 값이 동일하면 file2에서 값을 가져와 file1의 모든 동일한 레코드에 추가합니다.
file2의 첫 번째 레코드에 file1에 5개의 일치 항목이 있다고 가정하고 "|84569|21.5|1" 값을 가져와 file1의 모든 일치 항목에 추가합니다(예상 결과는 file3 참조). 마찬가지로, file2의 두 번째 레코드의 경우 file1에 5개의 일치 항목이 있으므로 "|0" 값을 가져와 file1의 일치하는 모든 레코드에 추가합니다. file2의 세 번째 레코드도 마찬가지입니다. 일치하는 항목이 3개 있으므로 "|21457879|12.4" 값을 가져와 file1의 일치하는 3개 줄 모두에 추가합니다.

file2에서 값을 가져와서 file1에 추가하도록 선택하는 방법을 생각하고 있다면 열 34에서 값을 가져와야 합니다. 시작 위치는 고정되어 있지만 끝 위치는 고정되어 있지 않습니다. 예 "a"와 같이 우리는 열 34/35/36에서 값을 가져오지만 "b"의 경우 열 34만 갖습니다. 그러나 "c"의 경우 34/35열의 값을 얻습니다.

아래 예에서 데이터 형식을 지정하는 방법을 모르겠습니다. 그러니 있는 그대로 주세요.

파일 1

a|a1|a2|a3|a4|...|a32|[email protected]
a|a1|a2|a3|a4|...|a32|[email protected]$1553:2015-02-14 
a|a1|a2|a3|a4|...|a32|[email protected]:2015-03-01 
a|a1|a2|a3|a4|...|a32|[email protected]$121:2015-01-31 
a|a1|a2|a3|a4|...|a32|[email protected]$293:2015-02-28 
b|b1|b2|b3|b4|...|b32|[email protected]$542:2013:05:24 
b|b1|b2|b3|b4|...|b32|[email protected]$542:2013:05:24 
b|b1|b2|b3|b4|...|b32|[email protected]:2013:05:24 
b|b1|b2|b3|b4|...|b32|[email protected]$542:2013:05:24 
b|b1|b2|b3|b4|...|b32|[email protected]:2014:05:24 
c|c1|c2|c3|c4|...|c32|[email protected] 
c|c1|c2|c3|c4|...|c32|$200:2011:12:06 
c|c1|c2|c3|c4|...|c32|[email protected]$214:2001:01:31 

파일 2

a|a1|a2|a3|a4|...|a32|[email protected]|84569|21.5|1 
b|b1|b2|b3|b4|...|b32|[email protected]$542:2013:05:24|0 
c|c1|c2|c3|c4|...|c32|[email protected]|21457879|12.4 

예상 파일: File3

a|a1|a2|a3|a4|...|a32|[email protected]|84569|21.5|1 
a|a1|a2|a3|a4|...|a32|[email protected]$1553:2015-02-14|84569|21.5|1 
a|a1|a2|a3|a4|...|a32|[email protected]:2015-03-01|84569|21.5|1 
a|a1|a2|a3|a4|...|a32|[email protected]$121:2015-01-31|84569|21.5|1 
a|a1|a2|a3|a4|...|a32|[email protected]$293:2015-02-28|84569|21.5|1 
b|b1|b2|b3|b4|...|b32|[email protected]$542:2013:05:24|0 
b|b1|b2|b3|b4|...|b32|[email protected]$542:2013:05:24|0 
b|b1|b2|b3|b4|...|b32|[email protected]:2013:05:24|0 
b|b1|b2|b3|b4|...|b32|[email protected]$542:2013:05:24|0 
b|b1|b2|b3|b4|...|b32|[email protected]:2014:05:24|0 
c|c1|c2|c3|c4|...|c32|[email protected]|21457879|12.4 
c|c1|c2|c3|c4|...|c32|$200:2011:12:06|21457879|12.4 
c|c1|c2|c3|c4|...|c32|[email protected]$214:2001:01:31|21457879|12.4 

답변1

이 답변에서는 "키"를 구성하는 필드 수를 지정해야 합니다. 분명히 실제 데이터에서는 32개이지만 예제 데이터에서는 처음 7개 필드가 핵심입니다.

awk -F'|'  -v nKeys=7 '
    NR==FNR {
        suff = ""
        for (i=nKeys+2; i<=NF; i++) suff = suff FS $i
        NF = nKeys
        suffixes[$0]=suff
        next
    } 
    {
        printf "%s", $0
        NF = nKeys
        print line suffixes[$0]
    }
' file2 file1 

키 필드 수를 계산할 수 있습니다.

awk -v nKeys=$(( $(head -1 file1 | tr '|' '\n' | wc -l) - 1 )) ...

하지만 우리는 아마도 숫자를 안전하게 하드코딩할 수 있을 것입니다.

관련 정보