我有两个文件。一个包含名称列表(只有一列),第二个文件包含三列名称、电话号码、国家/地区。
我想要的是提取名称不存在于文件 1 中但仅存在于文件 2 中的人的数据。
#!/bin/bash
for i in `cat file1 `
do
cat file2 | awk '{ if ($1 != "'$i'") {print $1 "\t" $2 "\t" $3 }}'>>NonResp
done
我得到的是一个奇怪的结果,其中的数据比预期的要多。
请帮忙。
假设,file2 中的字段分隔符为“”
awk -F, 'FNR==NR{a[$1];next}!($1 in a)' file1 file2
如果“ ,”不是分隔符,那么简单
awk 'FNR==NR{a[$1];next}!($1 in a)' file1 file2
就足够了。
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 -
你可以这样做grep:
grep -v -F -f file1 file2