ヘッダーの順序が異なる複数の大きなCSVファイルを貼り付ける

ヘッダーの順序が異なる複数の大きなCSVファイルを貼り付ける

フォルダに複数の大きなcsvファイルがあり、それを1つのcsvにバインド(結合)しようとしています。しかし、これを行うときは、接続後にすべての列値がその列に入っていることを確認したいと思います。メモリ制限のため、Rではこれを行うことはできません。私はシェルスクリプトに初めてアクセスし、すべてのcsvファイルをメモリに入れなくてもこれを行う方法があるかもしれません。

例えば。

> csv1
     A  B  C  D  E
     1  2  4  5  6
     4  5  7  8  9
     3  5  6  7  8
     2  3  4  5  8

> csv1
    C  B  E  D  A
    10 22 43 35 66
    14 15 37 48 99
    33 25 56 67 88

> Desired Output
         A  B  C  D  E
         1  2  4  5  6
         4  5  7  8  9
         3  5  6  7  8
         2  3  4  5  8
        66 22 10 35 43
        99 15 14 48 37
        88 25 33 67 56

私の試み:

保存時に各ファイルに対してRで列の順序を設定した後、以下のコードを使って接続してみました。私はLinuxシェルでこれを行う方法を知りたいです。

私の試み:

nawk 'FNR==1 && NR!=1{next;}{print}' *.csv > result.csv


Any help is highly appreciated.

RavindraSingh13のソリューション -

awk '
BEGIN{
  PROCINFO["sorted_in"] = "@ind_num_asc"
}
FNR==1{
  for(i=1;i<=NF;i++){
     a[$i]=i};
  if(FNR==1 && FNR==NR){
     print};
  next
}
{
  for(j in a){
     printf("%s ",$a[j])}
  print ""
}
' csv1 csv2

ただし、上記の解決策では、接続中にいくつかの行をスキップします。

答え1

牛に似た一種の栄養awk解決策。ただし、メモリ内のすべての値をマッピングします。

merge_by_headers.awkスクリプト:

#!/bin/awk -f

BEGIN{ PROCINFO["sorted_in"] = "@ind_str_asc" }
NR==1 || FNR==1{ 
    for (i=1; i<=NF; i++) map[i] = $i; 
    c = NF; next 
}
NR==FNR{ 
    row_cnt = NR-1; 
    for (i=1; i<=NF; i++) a[map[i]][row_cnt] = $i; 
    next 
}
{ 
    row_cnt += 1; 
    for (i=1; i<=NF; i++) a[map[i]][row_cnt] = $i; 
}
END{
    delete map; h = ""; 
    for (k in a) h = (h? h OFS:"")k; 
    print h; 
    for (i=1; i<=row_cnt; i++) { 
        cnt = c; 
        for (k in a) printf "%d%s", a[k][i], (--cnt? OFS : ORS) 
    }
}

使用法:

awk -f merge_by_headers.awk 1.csv 2.csv | column -t

出力:

A   B   C   D   E
1   2   4   5   6
4   5   7   8   9
3   5   6   7   8
2   3   4   5   8
66  22  10  35  43
99  15  14  48  37
88  25  33  67  56

関連情報