比较2个文件并从文件中提取元素

时间:2012-09-06 10:56:46

标签: shell awk

我有两个文件。一个包含名称列表(只有一列),第二个文件包含三个包含姓名,电话号码,国家/地区的列。

我想要的是提取名称在文件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 个答案:

答案 0 :(得分:1)

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

必须已对文件进行排序才能使其正常工作。 说明:

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

仅打印file2的第一个fileld并将其提供给下一个命令(|)

=> comm -1 -3 file1 - |

比较file1和最后一个命令的输出( - )并仅抑制file1(-1)中的行以及两个文件中的行(-3);只留下file2中的行并将其提供给下一个命令(|)

=> join file2 -

加入原始文件2和最后一个命令( - )的输出,并写出匹配行的字段(字段之间的空格被截断,但是)

测试用例:

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 :(得分: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

就足够了。

答案 2 :(得分:1)

您可以使用grep

执行此操作
grep -v -F -f file1 file2