0

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

我想要的是提取名称不存在于文件 1 中但仅存在于文件 2 中的人的数据。

#!/bin/bash

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

我得到的是一个奇怪的结果,其中的数据比预期的要多。

请帮忙。

4

3 回答 3

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

就足够了。

于 2012-09-06T12:25:49.203 回答
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 和最后一个命令 (-) 的输出,并写出匹配行的字段(但是,字段之间的空格被截断)

测试用例:

猫 <<EOF >file1
艾伦
伯特
辛迪
戴夫
弗雷德
晴天
泰德
EOF

猫 <<EOF >file2
伯特 01 AU
辛迪 03 CZ
金妮 05 CN
泰德 07 CH
佐罗 09 AG
EOF

awk '{print $1}' 文件2 | 通讯 -1 -3 文件 1 - | 加入文件2 -
于 2012-09-06T12:07:24.887 回答
1

你可以这样做grep

grep -v -F -f file1 file2
于 2012-09-06T12:46:18.940 回答