如何使用AWK结合通配符按列值过滤CSV数据?
AWK过滤CSV数据的解决方案
问题说明
需要过滤CSV数据,保留满足以下任一条件的行:
- 第二列以
Cu开头,且第三列以S或Te开头 - 第二列以
S或Te开头,且第三列以Cu开头
示例数据:
1 Er6 Te100 7.02455 1 0 0 -0.00420 2 Cu7 S150 6.96222 0 -1 0 -0.00421 3 Sc8 P50 7.01955 0 0 0 -0.00397
你尝试的awk '{ if (($2 == "Cu*")) { print } }' file无输出,原因是AWK中==是精确匹配,不支持通配符,需使用正则匹配语法。
解决步骤
1. AWK正则匹配规则
AWK中用~操作符实现正则匹配,^表示字段开头。比如匹配以Cu开头的第二列,写法为$2 ~ /^Cu/。
2. 组合逻辑条件
两个需求条件为或关系,每个条件内部是与关系:
- 条件1:
$2 ~ /^Cu/ && $3 ~ /^(S|Te)/ - 条件2:
$2 ~ /^(S|Te)/ && $3 ~ /^Cu/
3. 完整命令
awk '($2 ~ /^Cu/ && $3 ~ /^(S|Te)/) || ($2 ~ /^(S|Te)/ && $3 ~ /^Cu/) { print }' file
也可以拆分正则写法,效果一致:
awk '($2 ~ /^Cu/ && ($3 ~ /^S/ || $3 ~ /^Te/)) || (($2 ~ /^S/ || $2 ~ /^Te/) && $3 ~ /^Cu/) { print }' file
测试输出
用示例数据运行命令,将输出符合条件的第二行:
2 Cu7 S150 6.96222 0 -1 0 -0.00421
内容的提问来源于stack exchange,提问作者Jacek
相关产品推荐
相关产品推荐

