我在处理包含"%F"的数据时遇到了问题。在文件中并对其执行awk。
我正在尝试添加两个字段(shell中的$变量 - 但为了简单起见,下面是硬编码)到文件中每行的末尾。
当awk遇到" 200%F"在数据中,它给出了下面给出的错误。
我可以用sed替换%并稍后将其替换回来。有更优雅的方式/解决方法吗?
下面给出的测试数据。
输入
$ cat test1.out
a|b |c
e|200% F|f
所需的输出
$ cat res1.out
a|b|c|123|test1.out
e|200% F|f|123|test1.out
命令
awk -v dlm="|" -v var1="123" -v var2="test1.out" '{printf ($0 dlm var1 dlm var2 "\n")}' test1.out > res1.out
实际结果(错误)
$ awk -v dlm="|" -v var1="123" -v var2="test1.out" '{printf ($0 dlm var1 dlm var2 "\n")}' test1.out > res1.out
awk: (FILENAME=test1.out FNR=2) fatal: not enough arguments to satisfy format string
`e|200% F|f|123|test1.out
'
^ ran out for this one
答案 0 :(得分:2)
此处不要使用./integrate.sh: line 5: syntax error near unexpected token `if'
./integrate.sh: line 5: ` if [ $( basename${file1:0:1} ) == $(basename${file2:0:1} ) ];then'
,请使用printf
:
print
您看到通过使用awk -v OFS="|" -v var1="123" -v var2="test1.out" '{print $0,var1,var2}' test.out
变量,OFS
变量不再需要dlm
正在使用print
。
关于|
,只要您想使用printf
,请记住其签名:
printf
这意味着第一个参数将被解析为格式字符串。由于printf format_string [, arg1[, arg2[,...argN ]]]
在格式字符串中具有特殊含义,因此它将被展开。这会导致你的错误。
正确用法如下:
%
或者这个:
printf "%s%s%s\n", var1, dlm, var2
或甚至包含一些像这样的静态文本:
printf "%s|%s\n", var1, var2
但不喜欢这样:
printf "This is the output: %s|%s\n", var1, var2
答案 1 :(得分:2)
永远不要使用printf $0
,而是始终使用printf "%s", $0
,以便在输入包含printf格式化字符时,代码不会失败。同样使用任何其他输入值时也是如此。