さまざまな行数で複数の.csvファイルを並べてマージする必要があります。

さまざまな行数で複数の.csvファイルを並べてマージする必要があります。

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 追加できます。0NULL

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取ります。NRnor

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 ""}}'

おすすめ記事