AWK多列数据后处理脚本修改需求:移除文件名_cl_x.x后缀并添加CSV首行注释
调整后的脚本方案
我帮你优化了bash脚本,同时实现添加CSV注释首行和移除文件名中_cl_x.x部分这两个需求,下面是两种实现方式,你可以根据习惯选择:
方式1:将文件名处理整合到AWK中(更高效,减少管道调用)
# 先写入CSV首行注释,用>覆盖确保是第一行 echo "# ${experiment}.CSV" > "${home}/${experiment}.csv" # 用AWK一次性完成文件名处理和内容提取 awk '-F, *' '{ if (FNR == 2) { # 复制文件名到临时变量进行修改 fname = FILENAME # 移除文件路径 sub(/.*\//, "", fname) # 移除.txt扩展名 sub(/\.txt$/, "", fname) # 移除_cl_开头的版本号部分(匹配_cl_+数字+小数点) sub(/_cl_[0-9.]+/, "", fname) # 按格式输出 printf("%s| %s \n", fname, $5) } }' "${tmp}"/*.txt >> "${home}/${experiment}.csv"
方式2:保留原有SED管道,添加新的替换规则
如果你更习惯用SED处理字符串,可以在原有命令基础上新增一个SED规则:
# 先写入首行注释 echo "# ${experiment}.CSV" > "${home}/${experiment}.csv" # 原有AWK逻辑不变,修改SED命令添加新替换 awk '-F, *' '{if(FNR==2) printf("%s| %s \n", FILENAME,$5) }' "${tmp}"/*.txt | sed -e 's|/Users/gleb/Desktop/scripts/clusterizator/tmp/||' \ -e 's|\.txt||' \ -e 's/_cl_[0-9.]*//' >> "${home}/${experiment}.csv"
效果验证
执行后生成的CSV文件内容会完全符合你的要求:
results.CSVlig177| -0.1400
lig331| -8.0000
lig394| -4.3600
lig420| -5.5200
lig550| -4.3200
关键修改说明
- 首行注释:用
echo单独写入注释行,使用>覆盖文件确保它是第一行,避免追加导致的顺序问题; - 文件名清理:
- 方式1中用AWK的
sub()函数三次处理文件名,分别移除路径、扩展名和_cl_x.x部分; - 方式2中新增SED规则
s/_cl_[0-9.]*//,匹配_cl_后跟随的任意数字和小数点组合并删除。
- 方式1中用AWK的
内容的提问来源于stack exchange,提问作者user14748664
相关产品推荐
相关产品推荐

