for循环内的awk问题

Posted

技术标签:

【中文标题】for循环内的awk问题【英文标题】:awk issue inside for loop 【发布时间】:2022-01-17 17:55:05 【问题描述】:

我有许多以 txt 结尾的不同名称的文件。

rtfgtq56.txt
fgutr567.txt
..

所以我正在运行这个命令

for i in *txt
do
  awk -F "\t" 'print $2' $i | grep "K" | awk 'print' ORS=';' | awk -F "\t" 'OFS="\t"; print $i, $1' > $i%.txt*.k
done

我的问题是我想在第一列中添加每个文件的名称,所以我运行这部分:

awk -F "\t" 'OFS="\t"; print $i, $1' > $i%.txt*

$i 表示 for 循环中的文件, 但它不起作用,因为 awk 无法读取 for 循环中的 $i。 你知道我该如何解决吗?

【问题讨论】:

这能回答你的问题吗? How do I use shell variables in an awk script? 能否请edit 澄清预期的输出应该是什么样子?您想要文件名、选项卡以及第二列中包含K 的行中的所有值,它们之间有分号? 使用awk-v选项,可以基于shell变量创建awk变量。请参阅 awk 手册页。 【参考方案1】:

无论如何,您都想将所有内容重构为单个 Awk 脚本,请注意quote your shell variables.

for i in *.txt
do
    awk -F "\t" '/K/a = a ";" $2
      END  print FILENAME, substr(a, 1) ' "$i" > "$i%.txt*.k"
done

...假设我正确地解开了你的逻辑。 FILENAME Awk 变量包含当前输入文件名。

更一般地说,如果你真的想将一个变量从一个 shell 脚本传递给 Awk,你可以使用

awk -v awkvar="$shellvar" ' .... # your awk script here
    # Use awkwar to refer to the Awk variable'

也许另见useless use of grep

【讨论】:

... 而且您也不需要该变量,因为您不需要循环,您可以在 1 次调用 awk 中完成整个操作。但那将是一个不同的问题。 是的,但是您需要改为从 Awk 写入输出文件,我不想在显然是初学者的问题中解决这个问题。 了解,因此But that'd be a different question,只是认为应该让 OP 意识到这一点。【参考方案2】:

使用awk-v 选项,您可以基于shell 变量创建一个awk 变量。

awk -v i="$i" ....

另一种可能性是将i 设为环境变量,这意味着awk 可以通过预定义的ENVIRON 数组访问它,即ENVIRON["i"]

【讨论】:

以上是关于for循环内的awk问题的主要内容,如果未能解决你的问题,请参考以下文章

awk 脚本和 for 循环

为啥我的 for 循环在 AWK 中运行和重置?

awk 在算法中结合 for 和 while 循环

AWK中for循环调用数组解释

for 循环内的 async.waterfall 转义 for 循环

C;如果我在 while 循环内的 for 循环中放置一个 break