2つのファイルを結合するためのシェルスクリプト


8

shell script2つのファイルAとを取得するを記述して、次のBような結果を取得します。

ファイルA

user_a tel_a addr_a
user_b tel_b addr_b

ファイルB

process_1 user_a
process_2 user_a
process_3 user_b

そしてその結果:

user_a process_1 tel_a addr_a
user_a process_2 tel_a addr_a
user_b process_3 tel_b addr_b

これどうやってするの?awkまたは、他の何か?


2
私はそれを使用cutしてpasteのみ実行できると思いますが、私は正しい構文を取得していません。
ベルンハルト

ファイルに多くのレコードとフィールドがあり、カットアンドペーストできません!! これは単なるサンプルです。
Navid Farhadi、2012

1
@NavidFarhadiカット&ペーストしていない2つの実際のコマンドがあるcutpaste彼らのマニュアルページを見て。
Matteo

両方のファイルをメモリに完全にロードでき、awkも使用できます。
Navid

Linuxコマンドラインで実行可能であれば、perlなどを使用することもできます。
Navid Farhadi、2012

回答:


15

join ...

join -1 2 -2 1 FileB FileA

出力

user_a process_1 tel_a addr_a
user_a process_2 tel_a addr_a
user_b process_3 tel_b addr_b

入力ファイルはキーフィールドでソートする必要があります...サンプルファイルはすでにソートされているため、必要はありませんでしたが、それ以外の場合は次のようにソートを組み込むことができます。

join -1 2 -2 1 <(sort -k2 FileB) <(sort FileA)

数値パラメーターとは何ですか?
Navid Farhadi、2012

5
@Navid:マニュアルを参照man joinし、ターミナルのコマンドラインに入力することで、コマンドのパラメーターの最良かつ最も正確な説明をいつでも取得できます... -1 2   -2 1 手段:'1st-file 2nd-field'' 2番目のファイルの1番目のフィールド」
Peter.O

3

どこでも利用できるわけjoinpasteはないので(たとえば、私のBusyBoxベースのシステムにはありません)、要求に応じて、awkでこれを行う方法を次に示します。

awk 'BEGIN {
    while( (getline < "fileA") > 0) A[$1]=$2 OFS $3 # read fileA into the array A
    close("fileA")
  } {
    print $2, $1, A[$2]
  }' fileB

ところで、セパレーターを逃しましたA[$1]=$2 OFS $3... BEGINの手動ループを回避する別のバリ​​アントがありますが、それは(awkに対して)ほぼ同じですが、2番目のファイルに対して不要な条件テストを導入しています:awk 'NR==FNR {A[$1]=$2 OFS $3;next} {print $2, $1, A[$2]}' fileA fileB...(+ 1)
Peter.O 2012
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.