複数のファイルを1行ずつマージ

複数のファイルを1行ずつマージ

File3の指示に従って、単純なbashスクリプト(sed?awk?)を使用してFile1とFile2の行を新しいFile4にコピーできますか?

 File1: /*two or more columns, tab delimited*/
    AC    456324
    DC    689712
    GH    123677
    KL    236587

File2: /*two or more columns, tab delimited*/
    DC    AABBC TTYJU
    AC    DDDEE YYUKI
    KL    GGHHG QQSSD

 File3: /*one column*/
    AC
    DC

File4 /*tab delimited*/
    AC    456324    DDDEE   YYUKI
    DC    689712    AABBC   TTYJU

私は実際にPython辞書を使ってこれをやっていますが、簡単な解決策を知っていますか?

注:この質問にはすでに最も単純な形式の答えがあります。ファイルを1行ずつマージ

答え1

これは、配列を使用して接続したより簡単なケースの拡張です。awk

$ awk 'BEGIN{OFS="\t"} NR==FNR {a[$1]=$1;next;} \
    $1 in a {k=$1;$1="";a[k]=a[k]$0} END{for (i in a) print a[i]}' File3 File1 File2
AC      456324  DDDEE   YYUKI
DC      689712  AABBC   TTYJU

とは異なり、joinキーフィールドのファイルを事前にソートする必要はありません。

答え2

コマンドを使用して公正に実行できますjoin

$ join -j 1 <(sort file3) <(sort file1) > tmp ; \
    join -j 1 <(sort tmp) <(sort file2) | sed 's/ /\t/g' > file4
  • 初めてjoin使うファイル3そしてファイル1~からファイル3鍵があります。
  • 次に、上記のコマンドの出力を次のように作成します。tmp今すぐサインアップtmpそして ファイル2
  • 上記のコマンドに従って、出力はスペースで区切られた形式で表示されます。
  • sedあなたの要件はタブで区切られた形式なので、すべてのスペースをタブに置き換えるコマンドに提供しました。
  • ついに私は手紙を書いた。ファイル4あなたの要求に従って。

答え3

「単純さ」が多くのコードを書く必要がないことを意味するなら、多くのツールがあります。csvkitまたはCSV修理これに役立つ内容があります。特に両方を提供する「join」サブコマンドを見てください。

しかし、追加の要件があり得ないという意味であれば、「簡単な」方法はないと思います。少なくとも空虚な話ではないだろう。

また、とにかくこれはbashと標準のUnixユーティリティを使って解決しようとする問題ではありません。私の考えでは、この種のケースではPythonが良い選択です。特に問題がさらに複雑になると、さらにそうです。

関連情報