如何在awk中使用循环中的文件作为输入/输出文件?

如何在awk中使用循环中的文件作为输入/输出文件?

这是错误的:

for f in a*.dat; do 
    awk '.....' file1 "$f" > temp
    awk '.....' temp > "$f_out"
done

我想使用 a*.dat 作为输入,然后作为后缀 _out 的输出。非常感谢

答案1

_视为变量名称的一部分,因此您使用该变量f_out而不是f和 附加out。使用{}将解决您的问题。

for f in a*.dat; do 
    awk '.....' "$f" > "${f}_out"
done

答案2

  1. 您需要使用大括号来消除变量$f与字符串其余部分 ( _out) 的歧义。

    ie$f_out指的是名为的变量f_out(可能不存在,因此计算结果为空字符串),而表示附加的${f}_out变量的值。f_out

  2. 根据您的 awk 脚本正在执行的操作,您可能(几乎可以肯定)不需要运行两次 - 将一个脚本的输出通过管道传输到另一个脚本awk几乎没有用,如下:awkawk

    awk '.....' file1 "$f" > temp
    awk '.....' temp > "${f}_out"
    

    实际上与此相同:

    awk '.....' file1 "$f" | awk '.....' > "${f}_out"
    

    最好写成:

    awk '{....}; {.....}' "$f" > "${f}_out"
    

    在循环中:

    for f in *.dat; do
      awk '{....}; {.....}' "$f" > "${f}_out"
    done
    

顺便说一句,awk有一个名为“FILENAME”的内置变量,它等于当前正在处理的文件的文件名。这意味着您可能不需要循环for,只需执行以下操作即可:

   awk '{....}; { .... }; { print > FILENAME "_out" }' a*.dat

或者只是确保每个 print 语句都以> FILENAME "_out".

如果不确切知道这两个awk脚本的作用,就不可能比这更具体。

答案3

你的命令应该是这样的:

for f in a*.dat; do 
    awk '.....' "$f" > "${f}_out"
done

输出需要以这种方式进行,否则 shell 将尝试解释变量

f_out

相关内容