使用AWK处理数据中的%问题

时间:2017-09-27 19:17:31

标签: awk

我在处理包含"%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

2 个答案:

答案 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格式化字符时,代码不会失败。同样使用任何其他输入值时也是如此。