最初の列に複数のファイルをマージする

最初の列に複数のファイルをマージする

私の問題は次のようなものです。最初の列の値に基づいて複数の列をマージ

複数のファイル(10個以上)があり、それを1つの出力ファイルにマージ/結合したいと思います。たとえば、次のようになります。

ファイル1

2000 0.0202094
2001 0.0225532
2002 0.02553
2003 0.0261099
2006 0.028843

ファイル2

2000 0.0343179
2003 0.039579
2004 0.0412106
2006 0.041264

ファイル3

2001 0.03
2004 0.068689
2006 0.0645474

すべてのファイルは同じ2つの列を持ち、長さが異なります。列エントリがない場合(1つ以上のファイルから欠落している場合)1が必要です。ファイルにエントリがない場合(例:2005)、出力は望ましくありません。

希望の出力は次のとおりです。

        file1       file2       file3
2000    0.0202094   0.0343179   1
2001    0.0225532   1           0.03
2002    0.02553     1           1
2003    0.0261099   0.0395799   1
2004    1           0.0412106   0.0686893
2006    0.028843    0.041264    0.0645474

他の質問に対する回答で提供されているawkコードを修正してみましたが、解決できないようです。

ベストアンサー1

使用join:

join -a1 -a2 -e 1 -o auto <(join -a1 -a2 -e 1 -o auto file1 file2) file3

から見た男性が参加する

- ファイル番号
また、FILENUMがFILE1またはFILE2に対応するFILENUMが1または2のファイルFILENUMでペアリングできない行を印刷します。

-e 空
不足している入力フィールドをEMPTYに置き換える

-o形式
出力行を作成するときはFORMATに従ってください。

FORMATが "auto"キーワードの場合、各ファイルの最初の行は行ごとに出力されるフィールドの数を決定します。

注:結合にはソートされた入力が必要なので、これらの入力がソートされていない場合(与えられたサンプルにある)、最初にソートしてください。例:

join -a1 -a2 -e 1 -o auto \
    <(join -a1 -a2 -e 1 -o auto <(sort file1) <(sort file2)) \
    <(sort file3)

複数のファイルに適用するには:

  1. 最初の2つのファイルをリンクし、出力を3番目のファイルに保存します。join.tmp:

    join -a1 -a2 -e 1 -o auto file1 file2 >join.tmp
    
  2. nextは残りのファイルと更新を繰り返します。join.tmp各実行のファイル:

    for file in rest_files*; do
        join -a1 -a2 -e 1 -o auto join.tmp "$file" >join.tmp.1
        mv join.tmp.1 join.tmp
    done
    
  3. ついにあなたのものjoin.tmp最終接続結果になります。


タイトル付き印刷:

$ hdr() { awk 'FNR==1{ print "\0", FILENAME }1' "$1"; }
$ join -a1 -a2 -e 1 -o auto \
      <(join -a1 -a2 -e 1 -o auto <( hdr file1) <(hdr file2)) \
      <(hdr file3) |tr -d '\0'

マルチファイルバージョンの場合:

$ hdr() { awk 'FNR==1{ print "\0", FILENAME }1' "$1"; }
$ join -a1 -a2 -e 1 -o auto <(hdr file1) <(hdr file2) >join.tmp
$ for file in rest_files*; do
     join -a1 -a2 -e 1 -o auto join.tmp <(hdr "$file") >join.tmp.1
     mv join.tmp.1 join.tmp
  done
$ tr -d '\0' <join.tmp >final.file

おすすめ記事