如何用awk筛选CSV中特定字段为空/非空的行?
用Awk过滤CSV行的正确实现方法
需求
需要筛选CSV中满足以下任一条件的行:
- 第2字段为空(表现为
"")且第4字段非空 - 第2字段非空且第4字段为空
示例输入CSV
"venBio","http://www.venbio.com","","venBio is a Investor located in United States, North America." "zhenZhou","http://www.zhenzhou.com","","" "Loren","","","A famous Hollywood actress from the 1950s and 1960s"
期望输出
符合第一个条件的行:
"Loren","","","A famous Hollywood actress from the 1950s and 1960s"
符合第二个条件的行:
"zhenZhou","http://www.zhenzhou.com","",""
问题分析
你之前的命令失效,是因为CSV的空字段实际是带双引号的"",而非空字符串。用,分割后,字段内容包含引号,直接判断$2 == ""会匹配不到目标字段。
正确命令
针对条件1的命令
awk -F, '$2 == "\"\"" && $4 != "\"\""' input.csv
针对条件2的命令
awk -F, '$2 != "\"\"" && $4 == "\"\""' input.csv
如果需要兼容空字段内包含空格的情况(比如" "),可以用正则匹配:
# 条件1:第2字段为空(含仅空格),第4字段非空 awk -F, '$2 ~ /^"[[:space:]]*"$/ && $4 !~ /^"[[:space:]]*"$/' input.csv # 条件2:第2字段非空,第4字段为空(含仅空格) awk -F, '$2 !~ /^"[[:space:]]*"$/ && $4 ~ /^"[[:space:]]*"$/' input.csv
内容的提问来源于stack exchange,提问作者Sandeep
相关产品推荐
相关产品推荐

