列ヘッダーに基づいてファイルの列をマージする

列ヘッダーに基づいてファイルの列をマージする

同じ列ヘッダーを共有するファイルの複数の列をマージしたいと思います。ファイルは次のようになり、タブで区切ったり、別の方法で区別したりできます。

AaBbN    CcDdEeN    FfN     AaBbN    FfN
1        5          4   
3        1          2
2        NA         1
                            1        3
                            3        2
                            NA       4

したがって、フィールドに数字または文字列「NA」があります。結果は次のとおりです。

AaBbN    CcDdEeN    FfN
1        5          4
3        1          2
2        NA         1
1                   3
3                   2
NA                  4

順序付けされていない列が多いため、ヘッダーヘッダーを毎日手動で指定するのではなく、自動的に読み取る必要があります。空のフィールドもたくさんあります。私はこれを行うために研究して注文してきpasteました。私の列が同じファイルにある間に別のファイルで動作することを除いて、join特にjoin必要なことをするようです。

そのため、列を別々のファイルに分割してから、ここから派生したコマンドを使用してjoin接続してみました。awk

https://www.unix.com/unix-for-dummies-questions-and-answers/204303-splitting-up-text-file-into-multiple-files-columns.html

awk ' { for( i = 1; i <= NF; i++ ) printf( "%s\n", $(i) ) >i ".txt"; } ' file.txt

これにより別の列が提供されますが、ここで最初の問題が発生します。ヘッダーとデータの間にスペースがあるすべての列は正しく処理されませんでした。代わりに、これらのファイルには列ヘッダーしかありません。

2番目の質問は、joinファイルを再マージしようとすると、入力がソートされていないためにエラーが発生することです。もちろんこれは不可能です。どんなソートでも私が維持していた関係を破壊します。

だから私は今行き止まった路地に閉じ込められています。ファイルから直接列をマージするより便利な方法はありますか?


編集する:

AdminBeesソリューションはトラブルシューティングに最も近いですが、結果は正しくありません。上記の例にawkスクリプトを適用した結果は次のとおりです。すべての項目がタブで区切られていることを確認しましたsed -i "s/[[:space:]]/ /g"(タブを挿入するにはCTRL + VとTABを使用してください)。

AaBbN   CcDdEeN FfN     FfN
1   5   4   

3   1   2

2   NA  1

            1
            3
            NA

ベストアンサー1

入力内容がタブ区切りの場合:

awk -F"\t" '
NR == 1 {for (i=1; i<=NF; i++)  COL[i] = $i
        }
        {for (i=1; i<=NF; i++) OUT[NR, COL[i]] = $i
        }
END     {for (n=1; n<=NR; n++)  {split ("", DUP)
                                 for (i=1; i<=NF; i++)  if (!DUP[COL[i]]++) printf "%s" FS, OUT[n,COL[i]]
                                 printf RS
                                }
        }
' file
A   B   C   
1   5   4   
3   1   2   
2   2   1   
1       3   
3       2   
1       4   

後で部分索引として使用するために列ヘッダーを保存し、各行の値を行番号とヘッダー部分索引で索引付けされた配列に収集します。このENDセクションでは、配列を元の順序で印刷し、重複した列ヘッダーを処理します。

より複雑なファイル構造の場合、反復処理が主な作業になる可能性があります。

おすすめ記事