如何为AWK拆分文件的输出文件名添加指定前缀?
为AWK生成的输出文件添加Shell变量前缀
我原本使用以下AWK命令,根据test.csv第一列的每个值拆分生成对应文件:
awk -F "," '{print > $1 ".csv" }' test.csv
test.csv的内容如下:
1,Rahul, 2,Atul, 3,Sachin, 4,Reyansh, 1,Rahul, 3,Sachin
这条命令会生成1.csv、2.csv、3.csv和4.csv,但我的需求是给输出文件名添加前缀(比如示例中的sourcefile),得到sourcefile1.csv、sourcefile2.csv这类文件名,且前缀存储在Shell变量$fle_name中。
我尝试修改命令如下,但生成的文件名是$fle_name1.csv,不符合预期:
awk -F "," '{print > $1 "`echo $fle_name`.csv" }' test.csv
问题原因
AWK单引号包裹的代码块不会被Shell解析,所以echo $fle_name不会执行,直接被当作字符串拼接到文件名里,导致变量没有被替换成实际值。
解决方案
方法一:用AWK的-v选项传递变量
这是最规范的方式,通过-v参数将Shell变量传递给AWK内部使用:
fle_name="sourcefile" awk -F "," -v prefix="$fle_name" '{print > (prefix $1 ".csv")}' test.csv
这里将Shell变量fle_name赋值给AWK的prefix变量,然后拼接成目标文件名。用括号包裹文件名表达式,能避免第一列值包含特殊字符时出现语法错误。
方法二:Shell层面提前解析变量
通过引号嵌套,让Shell先解析变量值,再传递给AWK:
fle_name="sourcefile" awk -F "," '{print > "'"$fle_name"'" $1 ".csv"}' test.csv
原理是临时关闭AWK的单引号,插入被双引号包裹的Shell变量$fle_name,再重新打开单引号,确保变量值被正确替换后再交给AWK处理。
内容的提问来源于stack exchange,提问作者Rahul Bhosale
相关产品推荐
相关产品推荐

