web-dev-qa-db-ja.com

2番目の列のマッチングに基づいて列を追加する

2つのファイルがあります。最初のファイルの形式は次のとおりです。

10D0325 2465 0 0 -9 -9
10D0598 2567 0 0 -9 -9
10D0562 2673 0 0 -9 -9
10D0175 2457 0 0 -9 -9
10D0241 2209 0 0 -9 -9
10D0954 2312 0 0 -9 -9
10D0446 2489 0 0 -9 -9

2番目のファイルの形式は次のとおりです。

10D0325 1
10D0598 1
10D0175 2
10D0954 1
10D0446 2

私がやりたいのは、ID変数に基づいて、2番目のファイルの2番目の列を最初のファイルに追加することです。ご覧のとおり、最初の列を識別子変数として使用して、最初のデータセットを2番目のデータセットと照合できます。ただし、最初のファイルには、2番目のファイルには存在しない行/ IDがいくつか含まれています。したがって、両方のファイルを単純に注文して、この列を最初のファイルに貼り付けることはできません。

これを行うにはかなり簡単な方法があるはずですが、残念ながら私のLinuxスキルは限られています。

P.S.わかりやすくするために、これは結果のファイルをどのように見せたいかです(空白の代わりに他の記号を使用して欠落を示すことができます)。

10D0325 2465 0 0 -9 -9 1
10D0598 2567 0 0 -9 -9 1
10D0562 2673 0 0 -9 -9
10D0175 2457 0 0 -9 -9 2
10D0241 2209 0 0 -9 -9
10D0954 2312 0 0 -9 -9 1
10D0446 2489 0 0 -9 -9 2
4
mats

awkを使えばとても簡単です:

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

最初に(file2が読み取られているとき)、file2の2番目の列を格納する配列aを作成し、最初の列でインデックスを付けます。次に、配列から値を追加するfile1を出力します。

2
jimmij

joinを使用します:

join -j 1 -a 1 <(sort file1) <(sort file2)
  • -j 1:結合フィールドが最初のフィールドです
  • -a 1:ファイル1からペアリングできない行を出力します
  • sort:ファイルは結合のためにソートする必要があります
3
chaos