2つのUnixファイルをマージする

2つのUnixファイルをマージする

パイプで区切られた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 )) ...

しかし、私たちはおそらく数字を安全にハードコードすることができます。

おすすめ記事