BASH处理CSV:替换列值统计匹配内容导出,解决sed误替换问题
解决方案
问题原因
你之前使用的sed没有限定匹配位置,默认会替换整行中所有匹配到的内容,所以第二列数值如果和年份值相同就会被误替换。同时原有awk命令没有跳过CSV表头行,极端情况下会出现表头计数错误。
最优方案:单awk命令完成全流程
直接在awk中完成匹配、计数、年份替换、CSV格式输出,不需要额外调用sed,避免跨命令匹配错误:
awk -F',' ' BEGIN { IGNORECASE=1 } # 跳过表头行 NR == 1 { next } # 第三列推文内容匹配完整单词play $3 ~ /\<play\>/ { # 替换年份映射 if ($1 == "2010") { label = "Early" } else if ($1 == "2013") { label = "Development" } else { # 其他年份不需要统计可直接跳过 next } count[label]++ } END { # 输出逗号分隔的CSV格式结果 for (label in count) { print label ", " count[label] } } ' Tweet.txt | sort
运行后直接输出预期结果:
Early, 1 Development, 2
修正sed方案(如需保留原流水线结构)
给sed匹配规则加行首锚定符^,仅替换每行开头的年份值,避免影响第二列内容,最后用tr将空格替换为逗号符合CSV格式:
awk -F',' 'BEGIN{IGNORECASE=1} NR==1{next} $3 ~ /\<play\>/{a[$1]++} END{for(i in a) print i,a[i]}' Tweet.txt | sort | sed -e 's/^2010/Early/' -e 's/^2013/Development/' | tr ' ' ', '
内容的提问来源于stack exchange,提问作者homies
相关产品推荐
相关产品推荐

