for循环内的awk问题

awk issue inside for loop

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

rtfgtq56.txt
fgutr567.txt
..

所以我运行正在执行此命令

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

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

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

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

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

for i in *.txt
do
    awk -F "\t" '/K/{a = a ";" }
      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

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

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

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