数据中处理率为%的AWK问题
我在处理文件中包含“%F”的数据并对其执行awk时遇到问题 我试图在文件的每一行末尾添加两个字段($shell中的变量,但为了简单起见,下面是硬编码的) 当awk在数据中遇到“200%F”时,它给出下面给出的错误 我可以用sed替换%并在以后将其替换回来。有没有更优雅的方法/解决方法 测试数据如下所示 输入数据中处理率为%的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
$ 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
在末尾输出分隔符。