両方のファイルの内容をマージし、列の内容を比較します。

両方のファイルの内容をマージし、列の内容を比較します。

両方のファイルの内容をマージする際に問題があります。

ファイル1:

873 1.1.1.1 
1033 99.99.99.10
1108 78.2.204.174
1257 78.2.8.181

ファイル2:

test1 78.2.8.181 p6
test2 99.99.99.10 p9
test7 1.1.1.1 p10
test8 78.2.204.174 p4

共有列が2番目であり、問​​題の行に合わせて比較する必要があることを考慮して、以下のように2つのファイルを1つにマージしたいと思います。

873  1.1.1.1      test7 p10
1033 99.99.99.10  test2 p9
1108 78.2.204.174 test8 p4
1257 78.2.8.181   test1 p6

awk私はこれを成功させずにいくつか試しました。

答え1

joinこの目的に使用できます。

まず、2番目の列をキーとして使用して両方のファイルを並べ替える必要があります。

$ sort -t' ' -k 2,2 a > as
$ sort -t' ' -k 2,2 b > bs

次に続く:

$ cat as
873 1.1.1.1
1108 78.2.204.174
1257 78.2.8.181
1033 99.99.99.10
$ cat bs
test7 1.1.1.1 p10
test8 78.2.204.174 p4
test1 78.2.8.181 p6
test2 99.99.99.10 p9

それから実際に参加してください。

$ join -t' ' -j2 as bs
1.1.1.1 873 test7 p10
78.2.204.174 1108 test8 p4
78.2.8.181 1257 test1 p6
99.99.99.10 1033 test2 p9

答え2

join -j2 <(sort -k2 file1) <(sort -k2 file2) -o 1.1,1.2,2.1,2.3 | column -t

出力

873   1.1.1.1       test7  p10
1108  78.2.204.174  test8  p4
1257  78.2.8.181    test1  p6
1033  99.99.99.10   test2  p9

答え3

awkを使用する1つの方法:

$ awk 'NR==FNR{a[$2]=$1 FS $3;next}{print $0 FS a[$2] }' file2 file1
873 1.1.1.1  test7 p10
1033 99.99.99.10 test2 p9
1108 78.2.204.174 test8 p4
1257 78.2.8.181 test1 p6

ファイルf2は配列にロードされます。ここで、2番目のフィールドはインデックスであり、配列値はfile2の3番目と4番目のフィールドの組み合わせです。 file1 が処理されると、配列に格納された値とともに行全体が印刷されます。

関連情報