2016-11-02 4 views
0

にファイルを結合し、私はあなたがそれぞれのファイルに列bash? - CSVを

すなわちを保持している場合.csvファイルに複数のファイルを結合するpasteを使用できること(hereを参照)知っpaste -d "," column1.dat column2.dat column3.dat ... > myDat.csv

myDat.csv

になります。
column1, column2, column3, ... 
c1-1,  c2-1,  c3-1, ... 
c1-2,  c2-2,  c3-2, ... 
...  ...  ... 

(タブなし。ただ、それを読みやすくするためにそれらを挿入)

私は複数の測​​定を持っている場合は、inste広告?

file1.datは、形式は<xvalue> <y1value>

file2.datているフォーマット<xvalue> <y2avlue>

file3.datているフォーマット<xvalue> <uvalue> <vvalue>

と私は最終的に欲しい

<xvalue>, <y1value>, <y2value>, <empty column>, <uvalue>, <vvalue> 

のようなCSV?

どのようにファイルを結合するのですか?各ファイルがソートされている(あるいはそうでない場合はソートすることができます)が、彼らは必ずしも同じ行に同じxvaluesが含まれていないことを

編集

注意。

ファイルに別のファイルにあるxvalueがない場合、対応する列エントリは空白にする必要があります。

(実は、私はすべてのファイルに存在しないxvaluesの行をドロップすることも動作するはずだと思う。)

+0

各ファイルはソートされていますか? file2.datにはfile1.datにない 'xvalue'が含まれていますか? – andlrc

+0

@andlrcはいソートされています(もしそうでなければ、ファイルを結合する前にそれらをソートするのは難しくありません)。残念ながら、 '' xvalue''の不一致にも賛成です。 – User1291

答えて

1

ここで私の解決策はGnu awkです。より一般的な解決策に傾き、外部ツールを使って余分な空の列を処理します。それは多次元配列を使用しているのでGnu awkにありますが、おそらく他のawkにも容易に一般化することができます。

プログラムは、各ファイルの最初のフィールドがキー列になることを期待するフィールドを結合します。結合するキーが見つからない場合は、新しいキーを作成し、出力時に空のフィールドを出力します(以下の通知キーx_3x_4およびx_5のデータファイル)。

まず、データファイル:

$ cat file[123].dat    # 3 files, separated by empty lines for clarity 
x_1 y1_1 
x_2 y1_2 
x_3 y1_3 

x_1 y2_1 
x_2 y2_2 
x_4 y2_4 

x_1 u_1 v_1 
x_2 u_2 v_2 
x_5 u_5 v_5 

とコード:

$ cat program.awk 
BEGIN { OFS=", " } 
FNR==1 { f++ }        # counter of files 
{ 
    a[0][$1]=$1        # reset the key for every record 
    for(i=2;i<=NF;i++)      # for each non-key element 
     a[f][$1]=a[f][$1] $i (i==NF?"":OFS) # combine them to array element 
} 
END {           # in the end 
    for(i in a[0])       # go thru every key 
     for(j=0;j<=f;j++)      # and all related array elements 
      printf "%s%s", a[j][i], (j==f?ORS:OFS) 
}            # output them, nonexistent will output empty 

使用して出力:

file2.dat後の空の列が作成され、空のフィールドに生成されます
$ awk -f program.awk \ 
file1.dat \ 
file2.dat \ 
<(grep -h . file[123].dat|cut -d\ -f 1|sort|uniq) \ 
file3.dat 
x_1, y1_1, y2_1, , u_1, v_1 
x_2, y1_2, y2_2, , u_2, v_2 
x_3, y1_3, , , 
x_4, , y2_4, , 
x_5, , , , u_5, v_5 

すべてのキーを集め、それらを別の "ファイル"として入力することによって(プロセス置換を使用して)イオン<())より一般的なプログラムを維持する:

$ grep -h . file[123].dat|cut -d\ -f 1|sort|uniq 
x_1 
x_2 
x_3 
x_4 
x_5 
1

ただ、プロセス置換を使いますか?

paste -d, > myDat.csv \ 
    file1.dat \ 
    <(cut -d' ' -f2 file2.dat) \ 
    /dev/null \ 
    <(cut -d' ' -f2,3 file3.dat) 
+0

これは、ファイルがxvaluesで同意すると仮定していますか? – User1291

+0

です。そうでない場合、メモリ内にファイルを多重化してから正しい行を検索する必要があります。 – andlrc

+0

どうすればいいですか? – User1291

0

あなたはすべてのファイルを結合するpasteを使用して、(空の列を含む)したい列の印刷のみにawkを使用することができます列$3$5が除外されていることを

paste file1.dat file2.dat file3.dat | awk -v OFS=', ' '{print $1,$2,$4,"",$6,$7}' 

お知らせawkコマンドからは、列$1と同じです(つまり、すべてが<xvalue>です)。

+0

上記のandlrcの答えと同じ問題:ファイルがxvaluesで一致しているとみなされますが、必ずしもそうではありません。 – User1291