行の最初のセルに一致する各行に対してファイル 1 から 3 までの列を追加するには、新しい行を作成して追加します。

行の最初のセルに一致する各行に対してファイル 1 から 3 までの列を追加するには、新しい行を作成して追加します。

以下の4つのCSVファイルがあります。行の最初のセルが一致する各行に対してファイル1から3までの列を追加し、新しい行を作成して追加しようとします。

ファイル1:

N,Mon,Tue,Wed
1,A,B,C
2,D,E,F
3,I,J,X

ファイル2:

N,Mon,Tue,Wed
3,D,E,F
5,O,P,q
1,D,E,K

ファイル3

N,Mon,Tue,Wed
2,B,E,J
6,L,D,O
3,I,J,B

私の出力は次のようになります

N, Mon, Tue, Wed, Mon, Tue, Wed, Mon, Tue, Wed
1, A, B, C, D, E, F , , ,
2, D, E, F, , , , B, E, J
3, I, J, K, D, E, F, I, J, B
5, , , , O, P, q, , , 
6, , , , , , , L, D, O
Client Name,Monday 08/18,Tuesday 08/19,Wednesday 08/20,Thursday 08/21,Friday 08/22,Saturday 08/23,Sunday 08/24,Monday 08/25
ns2.advancemags.com->/var,Successful Full FS_UNIX_Mon_B Synthetic_Full 0B; ,,,,,,,Successful Full FS_UNIX_Mon_B Synthetic_Full 0B;
ns2.advancemags.com->/usr,Successful Full FS_UNIX_Mon_B Synthetic_Full 0B; ,,,,,,,Successful Full FS_UNIX_Mon_B Synthetic_Full 0B;
ns2.advancemags.com->/,Successful Full FS_UNIX_Mon_B Synthetic_Full 0B; ,,,,,,,Successful Full FS_UNIX_Mon_B Synthetic_Full 0B;
ns2.advancemags.com->/boot,Successful Full FS_UNIX_Mon_B Synthetic_Full 0B; ,,,,,,,Successful Full FS_UNIX_Mon_B Synthetic_Full 0B;
ns3.advancemags.com->/boot,,Successful Full FS_UNIX_Tue_C Synthetic_Full 0B; ,,,,,,
ns3.advancemags.com->/,,Successful Full FS_UNIX_Tue_C Synthetic_Full 0B; ,,,,,,
ns3.advancemags.com->/usr,,Successful Full FS_UNIX_Tue_C Synthetic_Full 0B; ,,,,,,

ベストアンサー1

Bashでの関数の定義

function hsort { 
head -n +1 "$1" ; sort <(tail -n +2 "$1"); 
}

それから

join -a1 -a2 -t, -o0,1.2,1.3,1.4,1.5,1.6,1.7,2.2,2.3,2.4 \
<(join -a1 -a2 -t, -o0,1.2,1.3,1.4,2.2,2.3,2.4 <(hsort file1) <(hsort file2)) \
<(hsort file3) | sed 's/,/, /g'

与える

N, Mon, Tue, Wed, Mon, Tue, Wed, Mon, Tue, Wed
1, A, B, C, D, E, K, , , 
2, D, E, F, , , , B, E, J
3, I, J, X, D, E, F, I, J, B
5, , , , O, P, q, , , 
6, , , , , , , L, D, O

[注:file2D,E,Kの1行目の内容は、D,E,F目的の出力に表示されているものとは異なります。 ]


4つのファイルに拡張するのは簡単です。

join -a1 -a2 -t, -o0,1.2,1.3,1.4,1.5,1.6,1.7,2.2,2.3,2.4,2.5,2.6,2.7 \
<(join -a1 -a2 -t, -o0,1.2,1.3,1.4,2.2,2.3,2.4 <(hsort file1) <(hsort file2)) \
<(join -a1 -a2 -t, -o0,1.2,1.3,1.4,2.2,2.3,2.4 <(hsort file3) <(hsort file4)) | 
sed 's/,/, /g'

扱うもっと4つ以上のファイルには追加の接続レベルが必要で、素早く見苦しくなり始めます。この場合、このアプローチはお勧めできません。

おすすめ記事