如何用Bash脚本提取指定模式对应数据并输出为CSV文件
问题描述
现有一份代码检查输出的文本文件,内容如下:
001_Two_Sum.py:48:5: CCR001 Cognitive complexity is too high (5 > 3) 001_Two_Sum.py:61:1: W293 blank line contains whitespace 002_Add_Two_Numbers.py:40:5: CCR001 Cognitive complexity is too high (7 > 3) 003_Longest_Substring_Without_Repeating_Characters.py:57:5: CCR001 Cognitive complexity is too high (4 > 3)
需要从中筛选出包含CCR001 Cognitive complexity的行,提取对应文件名和复杂度数值,生成指定格式的CSV文件:
filename,value 001_Two_Sum.py,5 002_Add_Two_Numbers.py,7 003_Longest_Substring_Without_Repeating_Characters.py,4
你之前尝试的脚本将所有文件名(含非目标行)和所有数值分别存入变量,输出时会导致文件名与数值无法一一对应,格式完全混乱。
解决方案
方法1:使用awk(推荐)
用awk直接筛选目标行并提取字段,一步生成符合要求的CSV:
echo "filename,value" > result.csv && awk '/CCR001 Cognitive complexity/ {split($0, arr, ":"); num=substr($NF, 2, index($NF, " ")-2); print arr[1] "," num}' file.txt >> result.csv
/CCR001 Cognitive complexity/:仅处理包含该标识的行split($0, arr, ":"):将当前行按冒号分割,arr[1]即为文件名substr($NF, 2, index($NF, " ")-2):提取最后一个字段(如(5 > 3))中的数字部分- 最终按
文件名,数值格式打印,追加到CSV文件
方法2:组合grep与sed
若习惯用文本处理工具组合,可采用以下命令:
echo "filename,value" > result.csv && grep "CCR001 Cognitive complexity" file.txt | sed -E 's/^([^:]+):.*\(([0-9]+) > .*/\1,\2/' >> result.csv
grep先筛选出目标行sed -E用正则捕获组:^([^:]+):捕获冒号前的文件名\(([0-9]+) > .*:捕获括号内的复杂度数值- 替换为
\1,\2即文件名,数值的格式
内容的提问来源于stack exchange,提问作者funnybunny
相关产品推荐
相关产品推荐

