
次の 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
で終わる行に追加されます|
。つまり、最初のファイルの不一致行に追加されます。
答え2
次のことを試すことができますawk
。
awk 'NR == FNR { k = substr($1, 1, 6); x[$1,$2] = k; y[$1,$2] = 0; next; } { for (i in x) { if (x[i] == $1) { split(i, t, SUBSEP); print t[1] "|" t[2] "|" $2; y[i] = 1; } } } END { for (i in y) if (y[i] == 0) { split(i, t, SUBSEP); print t[1] "|" t[2] "|B00/0000" } }' FS="|" input.txt FS=" " mapping.txt
結果は次のとおりです。
100180011|225|L08/2015
100180011|226|L08/2015
103823004|011|A06/2012
103823004|012|A06/2012
103823004|011|J02/2012
103823004|012|J02/2012
103823004|011|J03/2012
103823004|012|J03/2012
100181111|201|B00/0000
100181111|202|B00/0000