如何将AWK处理结果存入变量后通过system()调用写入目标文件
错误原因
- awk中访问自定义变量不需要加
$前缀,$是用于提取指定序号字段的专用运算符。你代码中的$myvar等价于提取第myvar个字段,初始myvar为空时默认等价于$0(当前处理行的完整内容),所以print > $myvar会直接把当前行内容作为文件名写入,自然就生成了一堆名为anything1();、anything2();的文件。 - awk内部变量和shell变量是互相独立的,你直接在
system()的参数字符串里写$myvar,读取的是shell环境的变量,根本拿不到awk内部的myvar值,而且touch命令仅用于创建空文件/修改文件时间戳,没有写入内容的功能。
正确实现方案
你可以在处理1.txt的过程中把所有处理后的行拼接存入awk变量,等全部处理完成后在END块中一次性调用system写入目标文件,参考代码如下:
awk \ 'BEGIN { myvar = "" } FNR==1 { ++f } f==1 { a[i++] = $0 } f==2 { if ($0 ~ /house/) { gsub(/house/, a[int(j++/2)%2]) } # 拼接处理后的行到myvar,保留换行符 myvar = myvar $0 "\n" } END { # \047是单引号的ASCII转义,避免内容里的特殊字符破坏shell命令结构 cmd = "printf \047%s\047 " myvar " > a.txt" system(cmd) }' \ 0.txt 1.txt
执行后生成的a.txt内容和你最初正确版本的输出完全一致。
内容的提问来源于stack exchange,提问作者7beggars_nnnnm
相关产品推荐
相关产品推荐

