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"]
.
我有许多不同名称的文件以 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"]
.