一、问题描述

现有某群人的联系名单 contacts.xlsx,及一个对该群人发放问卷获得的反馈 feedback.xlsx。该群人中不是每个人都填写了问卷;现需要知道哪些人没有填写。

其中,contacts.xlsx 的第三列是姓名,而 feedback.xlsx 的第二列是姓名。

两列都没有排序。

Excel for Mac 很卡;我 Excel 学得很差。

二、解决方案

先将两个 Excel 表格保存为 CSV。

然后在终端执行:

1
2
3
4
5
6
# 从 contacts.csv 取出第三列输出到 full
$ cut -d , -f 3 contacts.csv > full
# 从 feedback.csv 取出第三列输出到 part
$ cut -d , -f 2 feedback.csv > part
# 在 part 中检索 full 的每一行,检索不到的输出到 less
$ grep -Fvxf part full > less

其中:

  • cut:切割出输入中各行的特定部分
    • -d:指定分隔符。CSV 以逗号划分列,故分隔符为 ,
    • -f:指定列数
  • grep
    • -F:不解释正则表达式符号
    • -v:反向检索(输出不符合检索条件的行)
    • -x:只输出完全匹配的行
    • -f:从文件中读取检索表达式

查看输出:

1
2
3
4
$ less less
John Doe
Richard Roe

也可以用 awk 来代替 cut

1
2
awk -F "\"*,\"*" '{print $2}' feedback.csv > part
awk -F "\"*,\"*" '{print $3}' contacts.csv > full