技术咨询:用sed/awk输出变量内容到指定行及CSV合并脚本开发
嘿,这两个问题都是脚本开发里很常见的需求,我来给你详细讲讲解决方案:
问题1:用sed/awk将变量内容插入到输出文件的指定行
不管是插入到指定行之前,还是替换指定行,sed和awk都能轻松搞定,下面是具体的实现方式:
使用sed的方法
假设你要把变量MY_CONTENT的内容插入到output.txt的第3行(在原有第3行之前插入),可以这样写:
MY_CONTENT="This is the text from my variable" # GNU sed 环境(比如Linux) sed -i "3i $MY_CONTENT" output.txt # macOS/BSD 系统的sed需要额外加空字符串参数 sed -i "" "3i $MY_CONTENT" output.txt
如果变量里包含特殊字符(比如/、&),可以换个分隔符避免冲突:
# 用|作为sed的分隔符,适配变量里有/的情况 sed -i "3i|$MY_CONTENT|" output.txt
要是你想替换指定行而不是插入,把3i改成3c就行,比如sed -i "3c $MY_CONTENT" output.txt。
使用awk的方法
awk的写法更灵活,适合复杂逻辑的场景。比如同样插入到第3行:
MY_CONTENT="Hello from variable" awk -v target_line=3 -v insert_text="$MY_CONTENT" 'NR==target_line{print insert_text} 1' input.txt > output.txt
解释:
-v用来把shell变量传递到awk内部NR==target_line判断当前行号是否等于目标行,是的话先打印变量内容1是awk的简写,代表打印当前行(实现保留原有内容)
如果要替换指定行,只需要加个next跳过原有行的打印:
awk -v target_line=3 -v replace_text="$MY_CONTENT" 'NR==target_line{print replace_text; next} 1' input.txt > output.txt
问题2:合并多个Size-Projectname格式的CSV文件
根据你的需求,我分两种常见场景给你方案:
场景1:直接合并所有CSV内容(保留所有原始行)
最简单的方式就是用cat命令,但要注意处理文件末尾没有换行的情况,避免两行粘在一起:
# 直接合并所有.csv文件到combined.csv cat *.csv > combined.csv # 更稳妥的版本:确保每个文件末尾都有换行符 sed '$a\' *.csv | cat > combined.csv
sed '$a\'会给每个文件的最后一行追加一个换行,完美解决文件末尾无换行的问题。
场景2:按Projectname汇总Size(合并重复项目的大小)
如果多个CSV里有相同的Projectname,需要把它们的Size累加起来,用awk就能高效处理:
awk -F, '{ # 以Projectname为键,累加对应的Size total[$2] += $1 } END { # 遍历所有项目,输出汇总后的结果 for (project in total) { print total[project] "," project } }' *.csv > combined_summary.csv
要是你需要排序结果,可以搭配sort命令:
# 按Size从大到小排序 awk -F, '{total[$2] += $1} END{for(p in total) print total[p] "," p}' *.csv | sort -t, -k1,1nr > sorted_summary.csv # 按Projectname字母顺序排序 awk -F, '{total[$2] += $1} END{for(p in total) print total[p] "," p}' *.csv | sort -t, -k2,2 > sorted_by_project.csv
内容的提问来源于stack exchange,提问作者JasonD
相关产品推荐
相关产品推荐

