我想使用 awk 创建一个文本文件,其中包含一系列带有替换数字的 awk 文本行。我遇到的问题是文本将包含 awk 语法。最终,我希望得到如下所示的一行:
($2 == "cs.cpool") && (h==1) {printf("%f %s\n",$1==0.41369093,$2); a=1;}
所以我希望将上面的所有文本(包括第一个括号和最后一个括号)与另一个文本文件提供的数字 0.41369093 一起打印出来。
我有一个文本文件,其中包含我想要输入的数字,即:
0.41369093
0.00432739
0.03264715
我尝试通过在名为 create.awk 的文件中包括以下内容来创建它:
{printf("\n($2 == cs.cpool) && (h==1) {printf("%f %s\n",$1==< %f >,$2); a=1;}") }
其中名为 input.txt 的数字文本文件替换了< %f >
上面的内容。
然后执行:
awk -f create.awk < input.txt > new.txt
但是,我收到以下错误:
awk: syntax error at source line 1 source file create.awk
上下文是
{printf("\n($2 == cs.cpool) && (h==1) {printf("%f >>> %s\ <<< n",$1==< %f >,$2); a=1;}") }
awk: illegal statement at source line 2 source file create.awk
extra }
extra )
我将非常感激任何有关此事的帮助。谢谢你,珍妮特
答案1
在 printf() 中使用以下转义字符%%f
,%%s
和\"
代替%f
,%s
和"
。并且您可以在双引号外使用 $1 从输入文件中获取数值。
{printf("\n($2 == cs.cpool) && (h==1) {printf(\"%%f %%s\n\",$1=="$1",$2); a=1;}") }.
答案2
我建议你从不同的角度来处理这个问题。与其生成 3 个不同的awk
脚本,不如先将输入文件中带有数字的项目读入数组。然后,读取需要处理的任何文件并从数组中替换特定项目。
例如,下面这段代码中我给出了两个文件,第一个是数字,第二个是处理文件。var[1] 中,我从数组中读取第一个项目var
,以获取特定数字。您可以随意更改该数字,甚至可以使用 for 循环遍历数组并自动从数组中读取数字
awk '{i++;if (FILENAME == ARGV[1]) var[i]=$1 }{ if (FILENAME == ARGV[2]) print $2" " var[1] }' input-nums.txt testfile.txt
one 0.41369093
two 0.41369093
three 0.41369093