数据中处理率为%的AWK问题

数据中处理率为%的AWK问题,awk,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

我在处理文件中包含“%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
实际结果(错误)


不要在此处使用
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 "This is the output: %s|%s\n", var1, var2
printf var1, var2, "\n"
或者这个:

printf "%s|%s\n", var1, var2
或者,即使有一些静态文本,如下所示:

printf "%s%s%s\n", var1, dlm, var2
printf "This is the output: %s|%s\n", var1, var2
printf var1, var2, "\n"
但是不是这样的:

printf "%s%s%s\n", var1, dlm, var2
printf "This is the output: %s|%s\n", var1, var2
printf var1, var2, "\n"

不要在此处使用
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 "This is the output: %s|%s\n", var1, var2
printf var1, var2, "\n"
或者这个:

printf "%s|%s\n", var1, var2
或者,即使有一些静态文本,如下所示:

printf "%s%s%s\n", var1, dlm, var2
printf "This is the output: %s|%s\n", var1, var2
printf var1, var2, "\n"
但是不是这样的:

printf "%s%s%s\n", var1, dlm, var2
printf "This is the output: %s|%s\n", var1, var2
printf var1, var2, "\n"

切勿使用
printf$0
,而应始终使用
printf“%s”、$0
,以便在输入包含printf格式字符时代码不会失败。使用任何其他输入值时也是如此。

切勿使用
printf$0
,始终使用
printf“%s”、$0
,以便在输入包含printf格式字符时代码不会失败。使用任何其他输入值时也是如此。

谢谢您的补充说明。使用上述解决方案,如果我想在行尾添加“|”,该怎么办?您可以使用
{print$0,var1,var2,“}
。这将添加一个空的附加字段,使
打印
在末尾输出分隔符。感谢您的附加解释。使用上述解决方案,如果我想在行尾添加“|”,该怎么办?您可以使用
{print$0,var1,var2,“}
。这将添加一个空的附加字段,使
print
在末尾输出分隔符。