Shell 使用awk命令中的变量命名文件

Shell 使用awk命令中的变量命名文件,shell,awk,ksh,Shell,Awk,Ksh,我正在用awk命令分割一个文件,我想用一个变量命名这个文件,但是我运气不太好。这是一句话: awk '/STX/ {f="$tp"++i;} {print > f}' $tp.mixed 这只会创建名为$tp#的文件 我读了“如何在awk脚本中使用shell变量”这篇文章,但无法理解如何将其应用到我的问题中 阿努巴瓦在评论中回答了我的问题: awk -v tp="$tp" '/STX/ {if (f) close(f); f = tp (++i)} {print > f} END{

我正在用awk命令分割一个文件,我想用一个变量命名这个文件,但是我运气不太好。这是一句话:

awk '/STX/ {f="$tp"++i;} {print > f}' $tp.mixed
这只会创建名为$tp#的文件


我读了“如何在awk脚本中使用shell变量”这篇文章,但无法理解如何将其应用到我的问题中

阿努巴瓦在评论中回答了我的问题:

awk -v tp="$tp" '/STX/ {if (f) close(f); f = tp (++i)} {print > f} END{if (f) close(f)}' $tp.mixed
工作


感谢大家的帮助

您可以使用此awk命令从命令行传递变量:

awk -v tp="$tp" '/STX/{close(f); f=tp (++i)} f{print > f} END{close(f)}' "$tp.mixed"

同样重要的是关闭要打开以写入输出的文件。通过调用
close
我们可以避免由于打开了大量文件而导致的内存泄漏。

如果不展开awk脚本中的shell变量,则可能会出现重复。使用
-v awkvar=“$tp”``创建具有所需值的awk变量,然后在awk脚本中使用该变量
f=awkvar(++i)
或类似。
awk-vtp=“$tp””/STX/{if(f)close(f);f=tp(++i)}{print>f}END{if(f)close(f)}'$tp.mixed
谢谢阿努巴瓦!!成功了。问题,为什么必须使用if(f)close(f)和END{if(f)close(f)?谢谢你,试图更好地理解shell脚本和awk。@BrianDuffy打开的文件数量是有限制的。如果每次在这里处理文件时都显式使用
close
,你将永远不会达到这个限制。