【问题标题】:awk issue inside for loopfor循环内的awk问题
【发布时间】: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 手册页。

标签: bash for-loop 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"]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-09
    • 2021-08-18
    • 1970-01-01
    相关资源
    最近更新 更多