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问题的主要内容,如果未能解决你的问题,请参考以下文章