3〜5個の.csvファイルがあり、すべてを独自の列に維持しながら一緒にマージする必要があります。以下は、ファイルの行数が異なる単純な例です。ファイル1ファイル2ファイル3ファイル4ファイル5>最終ファイル。
ファイル1
1 1
1 1
1 1
ファイル2
2 2 2
2 2 2
ファイル3
3
3
3
3
ファイル4
4
4
ファイル5
5
5
5
5
5
すべてのファイルをマージしてすべてを独自の列に保持するには、.csvファイルの結果が必要です。私の例では、0は空のセル/列です。
最終文書
1 1 2 2 2 3 4 5
1 1 2 2 2 3 4 5
1 1 0 0 0 3 0 5
0 0 0 0 0 3 0 5
0 0 0 0 0 0 0 5
現在試しているすべての操作は、そのセル/列にデータがない場合、すべての項目を左にスライドさせます。
最終文書
1 1 2 2 2 3 4 5
1 1 2 2 2 3 4 5
1 1 3 5
3 5
5
ベストアンサー1
csvkit
ヘッダーを使用せずに-H
推論を無効にしてください-I
。それ以外の場合、値は次1
のように解釈されます。TRUE
csvjoin -H -I file*
これまで(ヘッダーがなくてエラーメッセージがあって文句を言って追加します)
a,b,a2,b2,c,a2_2,a2_3,a2_4
1,1,2,2,2,3,4,5
1,1,2,2,2,3,4,5
1,1,,,,3,,5
,,,,,3,,5
,,,,,,,5
欠落している値を置き換えて区切り文字を失う方法は好みの問題ですが、のフィールドを繰り返し、区切り文字をawk
に設定し、-F","
ヘッダーをスキップして変換フィールドをNR>1
追加できます。0
NULL
csvjoin -H -I file* | awk -F"," 'NR>1{for (i=1; i<=NF; i++) printf ("%s ", $i+0); print""}'
これはあなたが望む場所に行くでしょう
1 1 2 2 2 3 4 5
1 1 2 2 2 3 4 5
1 1 0 0 0 3 0 5
0 0 0 0 0 3 0 5
0 0 0 0 0 0 0 5
あるいは、純粋なawk
バージョンは、各ファイルのフィールド数が一定であると仮定する。
awk '{for (i=1; i<=NF; i++) {mx[FNR][nf+i]=$i}}
ENDFILE{nf+=NF; nor=(nor<FNR)?FNR:nor}
END{for (i=1;i<=nor;i++) {for (j=1;j<=nf;j++) printf ("%s ", mx[i][j]+0); print ""}}' file*
各ファイルの値を配列にロードするだけです。mx[][]
{for (i=1; i<=NF; i++) {mx[FNR][nf+i]=$i}}
各ファイルの末尾で、列インデックスをnf
ファイル内のフィールド数だけ右に移動し、現在のレコード数または最後の行列のサイズのいずれか大きい方をNF
取ります。NR
nor
ENDFILE{nf+=NF; nor=(nor<FNR)?FNR:nor}
最後に、行列次元を繰り返し、NULL
値を変換します。
END{for (i=1;i<=nor;i++) {for (j=1;j<=nf;j++) printf ("$s ", mx[i][j]+0); print ""}}'