2012-09-06 102 views
0

我有兩個文件。一個名單(只有一列),第二個文件有三個名字,電話號碼,國家。比較2個文件並從文件中提取元素

我想要的是提取名稱不在文件1中但僅存在於file2中的人員的數據。

#!/bin/bash 

for i in `cat file1 ` 
    do 
     cat file2 | awk '{ if ($1 != "'$i'") {print $1 "\t" $2 "\t" $3 }}'>>NonResp 
    done 

我得到的是一個奇怪的結果,數據比預期的要多。

請幫忙。

+3

什麼有這個做與Python? –

+0

經過兩分鐘的搜索,我發現[this](http://stackoverflow.com/questions/8181974/compare-two-files-with-awk-or-sed)。 –

回答

1

你可以用grep做到這一點:

grep -v -F -f file1 file2 
1
awk '{print $1}' file2 | comm -1 -3 file1 - | join file2 - 

這些文件必須已被排序才能正常工作。 說明:

=> awk '{print $1}' file2 | 

只打印文件2的第一fileld並前進到下一個命令(|)

=> comm -1 -3 file1 - | 

比較file1和最後一個命令的輸出( - ),只有壓制線在文件1(-1)以及兩個文件中的行(-3);離開線僅文件2和飼料這下一個命令(|)

=> join file2 - 

加入原有的文件2,並從最後一個命令的輸出( - ),並寫出場之間FO匹配的行中的字段(空白被截斷,但是)

測試用例:

 
cat <<EOF >file1 
alan 
bert 
cindy 
dave 
fred 
sunny 
ted 
EOF 

cat <<EOF >file2 
bert 01  AU 
cindy 03  CZ 
ginny 05  CN 
ted  07  CH 
zorro 09  AG 
EOF 

awk '{print $1}' file2 | comm -1 -3 file1 - | join file2 - 
1

假設字段分隔符爲 「,」 file2中

awk -F, 'FNR==NR{a[$1];next}!($1 in a)' file1 file2 

如果 「,」 不是分隔符,然後只需

awk 'FNR==NR{a[$1];next}!($1 in a)' file1 file2 

就足夠了。

+0

製表符分隔文件 – Angelo

+0

然後第二個應該工作。 – Vijay