如何在Unix中用awk和gsub给CSV/TXT文件末尾添加文件名列
解决awk处理CSV/TXT文件追加文件名列的问题
问题根源
你原命令的问题有两个:
- 输出分隔符错误:awk中
print的逗号会用默认的**输出字段分隔符(OFS,默认是空格)**拼接参数,所以print $0,",",FILENAME实际输出是$0 空格 , 空格 FILENAME,这会破坏CSV的逗号分隔结构,导致文件名出现在错误位置。 - 直接读写原文件风险:直接用
> "test.csv"会让awk在读取文件的同时写入,原文件会被提前清空,导致数据损坏。
修正后的命令
通用版(适配CSV,TXT也可使用)
awk '{gsub(/ /,"",$0); print $0 "," FILENAME}' test.csv > temp.file && mv temp.file test.csv
gsub(/ /,"",$0):去掉当前行所有空格,符合你“各列去除空格”的需求。print $0 "," FILENAME:直接把处理后的行和,文件名拼接,避免插入多余空格。- 用临时文件
temp.file中转,再替换原文件,彻底避免数据丢失风险。
分格式适配版(CSV用逗号,TXT用空格)
如果希望TXT文件用空格分隔追加列(更符合纯文本习惯),可以判断行内是否含逗号来区分文件类型:
awk '{ gsub(/ /,"",$0) if ($0 ~ /,/) { print $0 "," FILENAME # CSV文件用逗号分隔追加 } else { print $0 " " FILENAME # TXT文件用空格分隔追加 } }' input.txt > temp.file && mv temp.file input.txt
示例效果
输入test.csv内容:
col1,col2,col3
ab, cd, ef
gh, ij, kl
mn, op,qr
执行命令后输出:
col1,col2,col3,test.csv ab,cd,ef,test.csv gh,ij,kl,test.csv mn,op,qr,test.csv
注意事项
- 如果你的CSV字段包含带空格的合法值(比如
"hello world"),gsub(/ /,"",$0)会去掉这些空格,这种场景需要更复杂的CSV解析逻辑,但当前写法完全匹配你提出的“各列去除空格”需求。 - 临时文件名可以自定义,只要不与原文件重名即可。
内容的提问来源于stack exchange,提问作者Surya
相关产品推荐
相关产品推荐

