別のawk(ward)質問 - 複数のキーを使用した部分文字列のマッピング

別のawk(ward)質問 - 複数のキーを使用した部分文字列のマッピング

次の 2 つのファイルがあります。

mapping.txt:

100178  L08/2015
100180  L08/2015
103822  J03/2012
103823  A06/2012
103823  J02/2012
103823  J03/2012
...

input.txt:

100180011|225|
100180011|226|
100181111|201|
100181111|202|
103823004|011|
103823004|012|
...

output.txt入力ファイルの最初の6桁の数字がマッピングファイルの1つ以上のエントリと一致する場合は、3番目の列をマッピングファイルの2番目の列に出力し、そうでない場合は「B00/0000」と入力します。

100180011|225|L08/2015
100180011|226|L08/2015  
100181111|201|B00/0000
100181111|202|B00/0000
103823004|011|A06/2012
103823004|011|J02/2012
103823004|011|J03/2012
103823004|012|A06/2012
103823004|012|J02/2012
103823004|012|J03/2012

理想的にはこれはOSXで動作するはずですが、Linuxボックスにもアクセスできます。

ベストアンサー1

仮定しbash、両方のファイルが並べ替えられているとします。

join -a1 <(sed 's/./& /6' input.txt) mapping.txt | sed 's/ //g; s/|$/|B00\/0000/'

出力:

100180011|225|L08/2015
100180011|226|L08/2015
100181111|201|B00/0000
100181111|202|B00/0000
103823004|011|A06/2012
103823004|011|J02/2012
103823004|011|J03/2012
103823004|012|A06/2012
103823004|012|J02/2012
103823004|012|J03/2012

awk見えません。申し訳ありません。 :)

編集する:説明する:

  • sed 's/./& /6'- 各行の6番目の文字の後にスペースを追加すると、次のように出力されます。100180 011|225|L08/2015
  • join -a1最初の列のファイルをリンクします。最初のファイルの一致しない行を変更せずに残すように-a1指示します。join
  • sed 's/ //g;'- 結果からスペースを削除
  • ... 's/|$/|B00\/0000/'-/|B00/0000で終わる行に追加されます|。つまり、最初のファイルの不一致行に追加されます。

おすすめ記事