共通の列を使用してファイルをマージする


8

2つのファイルのうち、すべての情報を含む3つ目のファイルを作成したいです。

ファイル1:

a 111 
b 222 
c 333 
d 666 
e 777 

ファイル2:

111 x1  
222 x2
333 x3
444 x4 
555 x5 
666 x6 
777 x7 
888 x8

私はそれらを以下のように組み合わせたいと思います:

111  x1  a
222  x2  b
333  x3  c
444  x4  0
555  x5  0
666  x6  d
777  x7  e
888  x8  0

注意:

ファイル1の2列目は、ファイル2の1列目のサブセットです

回答:


7

joinコマンドは、ファイルがあなたのサンプルのようにソートされている場合は、必要なものはほとんどありません。

join -12 -a2 file1 file2 -o2.1,2.2,1.1

一致しない行にゼロを追加するだけです。-eそのためにスイッチを使用できます。

join -12 -a2 file1 file2  -o2.1,2.2,1.1 -e0

追加する場合、-e0perlは必要ありません:)
LilloX

@LilloX:はい、ありがとうございます。試しましたが失敗しました(タイプミス)。
チョロバ2015

13

結合の使用:

join -1 1 -2 2 -a1 -e0 -o'0,1.2,2.1' file2 file1

joinコマンドは、データの共通フィールドを共有する2つのファイルの行を結合します。この場合:file2のフィールド1(-1 1)と-2 2file1のフィールド2()を使用して、file2とfile1を結合します。

出力は次のようになります: "結合されたフィールド、file2のフィールド2、file1のフィールド1"(-o'0,1.2,2.1')、欠落しているフィールドがある場合は0(-e0

2つのファイルの1つにさらにレコードがある場合は、それらを追加します(この場合はfile2)(-a1

コマンドjoinのマンページを参照してください


良い。少し説明を追加していただけませんか?
Lety

確かに、更新されました:)
LilloX

5

少しawk魔法:

awk 'FNR==NR{a[$2]=$1;next}{if(a[$1]==""){a[$1]=0}; \
    printf "%s%s%s%s%s\n",$1,FS,$2,FS,a[$1]}' \
    file1 file2

または

awk 'FNR==NR{a[$2]=$1;next}{if(a[$1]==""){a[$1]=0};
    print $1,$2,a[$1]}' file1 file2

出力

111 x1 a
222 x2 b
333 x3 c
444 x4 0
555 x5 0
666 x6 d
777 x7 e
888 x8 0

説明

  • FNR==NR{a[$2]=$1;next}

    file1FNR==NR)を実行し、Key-Value構造を作成します。キーはの2列目($2)でfile1、値はの1列目($1)ですfile1

  • {if(a[$1]==""){a[$1]=0};print $1,$2,a[$1]}

    を実行しfile2

    • if(a[$1]==""){a[$1]=0}

      の最初の列($1)のキーがにfile2存在しない場合はfile10

    • print $1,$2,a[$1]

      printの最初と2番目の列、file2および最初の列($1)のキーを持つKey-Value構造の値を(を使用して)印刷しますfile2

      または

    • printf "%s%s%s%s%s\n",$1,FS,$2,FS,a[$1]}'

      printfの第1列と第2列、file2および第1列($1)のキーを持つキーと値の構造の値を(を使用して)印刷しfile2ます。

      • FS 入力ファイルから取得した列間のセパレーター

      • "%s%s%s%s%s\n"

        出力のフォーマットです

        • %s - ストリング

        • \n –改行


コードについて説明してもらえますか?
gforce89 2015

はい、回答を更新しました。
AB

1

qの使用:

$ q "select f2.c1, f2.c2, ifnull(f1.c1,0) from file_2.txt f2 LEFT JOIN file_1.txt f1 on f1.c2 = f2.c1 "
111 x1 a
222 x2 b
333 x3 c
444 x4 0
555 x5 0
666 x6 d
777 x7 e
888 x8 0

この方法は時々読みやすいかもしれません。


1
疑問に思う方のためqに、パッケージpython3-q-text-as-data(Python 3)とパッケージpython-q-text-as-data(Python 2)にあります。
kos

ありがとう、でもこのqパッケージはどこで手に入りますか?python-q-text-as-dataまたはをインストールできないようですpython3-q-text-as-data。「E:パッケージpython3-q-text-as-dataが見つかりません」。私のシステムがすでにインストールされているpythonpython2.7python3、とpython3.4
Paddy Landau

パッケージが古すぎて、ディストリビューションリリースで利用できない可能性があります。Github:github.com/harelba/q
Viの
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.