【发布时间】:2021-12-20 23:07:06
【问题描述】:
根据https://stackoverflow.com/a/69874658/10824251https://stackoverflow.com/a/69874658/10824251 的先前回答,我有以下 awk 脚本示例:
awk \
'
FNR==1 {++f}
f==1 {a[i++]=$0}
f==2 {if ($0~/home_cool/) {gsub(/home_cool/, a[int(j++/2)%2]) }; print > "2.txt"}
k==1 {system("echo 'text' && sleep 4")}
f==3 {if ($0~/home_cool/) {gsub(/home_cool/, a[int(k++/2)%3 + 2]) }; print > "3.txt"}
k==1 {system("echo 'text2' && sleep 4")}
f==4 {if ($0~/home_cool/) {gsub(/home_cool/, a[int(k++/2)%3 + 2]) }; print > "4.txt"}' \
1.txt 0.txt 0-1.txt 0-2.txt
我试图在创建 2.txt 文件之后和创建 3.txt 文件之前只运行一次命令 shell。
这意味着特定的 shell 命令只能在 2.txt 文件完全创建后执行。
解决方案还应该能够在创建4.txt 之前打印text2。
我正在使用system(),到目前为止我的尝试效果不佳,唯一不起作用的是shell脚本执行了3次而不是1次(这可以通过3 text看到打印在屏幕上)。
我可以做些什么来看看真正错过了什么来解决这个问题并且echo 'text' 只运行一次并且在2.txt 被创建之前?
我试图在system() (system("counter=0; if [[ "$counter" -gt 2 ]] then echo "text" fi; sleep 4")) 中插入一个计数器(没有while)但没有用,而且它真的没有多大意义,因为counter=0 应该不在system() 中我相信。
说明选择已解决状态的答案:
怀疑复杂而残酷,请选择我将给出的答案:
一方面解释了很多关于用户个人帐户的简单性@dan 答案(作者对上一期文件号的答案awk);
另一方面,对于向用户@markp-fuso 学习非常有用的深化答案。
也许我应该在其他用户需要阅读这个问题时考虑一下,所以我会选择如何解决markp-fuso的问题。我希望了解所有作者对此问题的答案。
【问题讨论】:
-
只需添加一个变量
haverun并使用k==1 && haverun==0。然后在system("echo 'text' && sleep 4")之后添加; haverun=1。你可以给它起任何你喜欢的名字。您只是将变量用作标志来告诉您system()是否已运行。 -
认为标志只是作为
0/1,或not run/run跟踪system()是否已运行的“状态”的方式。您可以通过无数种方式在编程中使用相同的标志概念。如果您仍有疑问,请告诉我。 -
这样做。
awk -v haverun=0 \ ...或在FNR==1 {++f}之前删除变量,添加BEGIN { haverun=0 }。无论哪种方式都可以。 -
您甚至可以完全消除声明。当 awk 遇到一个尚未声明的变量时,它被定义为具有
0的值。所以如果你看我的第一条评论,我没有提到在任何地方声明haverun。示例printf "%s\n" a b 1 2 3 | awk 'haverun>1; { haverun++ }'(注意: 一个条件不跟随{ .. }就像haverun>1只是使用默认命令print- 如果您想知道数字是如何打印出来的)GNU Awk User's Guide 是你的朋友。 -
awk 是一个操作文本的工具。 shell 是一种工具,用于操作文件和进程以及对其他工具的顺序调用。您正在尝试编写一个 awk 脚本来对其他工具的调用进行排序,即您正在尝试让 awk 完成 shell 存在的工作。我强烈建议您不要这样做,只需使用 shell 调用 awk 和其他适当的工具。我希望您的问题更清楚,这样我们就可以指导您如何以正确的方式做任何您想做的事情,而不是帮助您实施几乎可以肯定是错误的方式。