2016-09-23 7 views
0

私は2つのテキストファイルに1つのidのリストと、もう1つにはidと対応する値を持っています。Awkを使って2つのファイルを比較する

ファイル1

abc 
abcd 
def 
cab 
kac 

ファイル2

abcd 100 
def 200 
cab 500 
kan 400 

だから、私は両方のファイルを比較し、一致した列の値を取得しても、ファイル1からすべてのIDを保持し、割り当てたいです」所望の出力ファイル2

に値を持っていないIDへのNA」

abc  NA 
abcd 100 
def  200 
cab  500 
kac  NA 

PS:のみawkスクリプト/ワンライナー

私は一致する列を印刷するために使用しているコード:

awk 'FNR==NR{a[$1]++;next}a[$1]{print $1,"\t",$2}' 
+0

だから、何を試しましたか? –

+0

私は一致する値しか印刷できませんでした。 – arupgsh

+2

あなたの質問にそのコードを追加してください。 –

答えて

3
$ awk 'NR==FNR{a[$1]=$2;next} {print $1, ($1 in a? a[$1]: "NA") }' file2 file1 
abc NA 
abcd 100 
def 200 
cab 500 
kac NA 
0

joinsort(うまくいけばポータブル)の使用:

export LC_ALL=C 
sort -k1 file1 > /tmp/sorted1 
sort -k1 file2 > /tmp/sorted2 
join -a 1 -e NA -o 0,2.2 /tmp/sorted1 /tmp/sorted2 

bashでは、here-filesを1行で使用できます。

LC_ALL=C join -a 1 -e NA -o 0,2.2 <(LC_ALL=C sort -k1 file1) <(LC_ALL=C sort -k1 file2) 

注1、これは1列でソート出力を与える:

abc NA 
abcd 100 
cab 500 
def 200 
kac NA 

注2、コマンドもLC_ALL = Cなく動作することができます。重要なのは、すべてのソートおよび結合コマンドが同じロケールを使用していることです。

関連する問題