2017-03-02 126 views
0

貓文件1:比較兩個文件,並從提取的信息都用awk

a 
b 
c 
d 
e 

貓文件2:

a 10 
c 20 
e 30 
f 40 

所需的輸出文件是:

a 10 
b 
c 20 
d 
e 30 
f 40 

我試着使用awk但我結束了file1的所有行重複。 非常感謝

+5

控制輸出的邏輯是什麼? –

+1

「我試過使用awk」..你需要在你的Q中包含代碼,所以我們可以幫助解決它!否則嘗試搜索'[linux] join'或'[bash] join'並閱讀'man join'。祝你好運。 – shellter

回答

3

讀入這兩個文件並將它們散列到一個數組(a)。如果您在file2之前閱讀file1,碰撞將對您有利。在AWK:

$ awk '{a[$1]=$0} END{for(i in a) print a[i]}' file1 file2 
a 10 
b 
c 20 
d 
e 30 
f 40 

解釋:

{ 
    a[$1]=$0  # hash all records to a 
} 
END {    # after processing both files 
    for(i in a)  # iterate thru every key in a 
     print a[i] # and output their values 
} 

由於對for(i in a)性質的輸出順序是隨機的。

2

另一awk和少聰明的方式來做到這一點

$ awk 'NR==FNR {a[$1]=$2; next} 
     $1 in a {$2=a[$1]; delete a[$1]} 
       1; 
     END  {for(k in a) print k,a[k]}' file2 file1 

a 10 
b 
c 20 
d 
e 30 
f 40 
0

不知道awk對於OP硬性要求,但這裏是一個使用join這似乎更適合於手頭工作的替代解決方案(如@ shellter也指出):

$ join -a1 -a2 file1 file2