파이프로 구분된 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 )) ...
하지만 우리는 아마도 숫자를 안전하게 하드코딩할 수 있을 것입니다.