私の問題は次のようなものです。最初の列の値に基づいて複数の列をマージ
複数のファイル(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)
複数のファイルに適用するには:
最初の2つのファイルをリンクし、出力を3番目のファイルに保存します。
join.tmp
:join -a1 -a2 -e 1 -o auto file1 file2 >join.tmp
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
ついにあなたのもの
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