パイプで区切られた2つのファイル(例:file1とfile2)があります。そのうち、file1は33個の列を持ち、file2は34/35/36個の列を持つことができます。したがって、私たちが持っている10の数について考えないでください。
私がしたいのは、file1とfile2(1列から32列まで)の値を比較することです。すべての値が同じ場合は、file2から値を取得し、file1のすべての同じレコードに追加します。
file2 の最初のレコードに file1 に 5 つの一致があると仮定し、"|84569|21.5|1" 値を取得し、file1 のすべての一致に追加します (予想結果は file3 を参照)。同様に、file2の2番目のレコードの場合、file1に5つの一致があるため、「| 0」の値を取得し、file1の一致するすべてのレコードに追加します。 file2の3番目のレコードも同様です。一致するものが 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 )) ...
しかし、私たちはおそらく数字を安全にハードコードすることができます。