【发布时间】:2022-01-05 21:27:15
【问题描述】:
我的源文件:
0.txt:
anything1
anything2
anything3
anything4
1.txt如下:
house();
shop("");
house();
shop("");
house();
shop("");
使用时:
awk \
'FNR==1 {++f}
f==1 {a[i++]=$0}
f==2 {if ($0~/house/) {gsub(/house/, a[int(j++/2)%2]) }; print > "a.txt"}
' \
0.txt 1.txt
所以一个.txt:
anything1();
shop("");
anything1();
shop("");
anything2();
shop("");
但我想先将此内容传递给variable,然后使用variable 使用system() 在a.txt 上写字:
awk -v myvar='' \
'FNR==1 {++f}
f==1 {a[i++]=$0}
f==2 {if ($0~/house/) {gsub(/house/, a[int(j++/2)%2]) }; print > $myvar; system("touch $myvar a.txt")}
' \
0.txt 1.txt
此打印文件名称为anything1();、anything2();、anything1(); ..
但打印 a.txt 为空。
可以将f==2的输出(FNR==1 {++f}中正在处理的当前文件)捕获到myvar变量,然后传递给system()?
【问题讨论】:
-
也许你应该简化你的示例代码。不清楚为什么要将数据存储在变量中以及以后如何处理变量。据我所知,您的脚本会创建文件
a.txt和b.txt。是否要处理这些文件中的数据?代码cat $f | grep 'house'将从名为$f的文件中提取与house匹配的行。它的作用与grep ' house' $f相同。你预期的最终结果是什么?按照您的想法设置 shell 变量可能很困难。为什么不直接在一个 AWK 脚本中进行所有处理? -
@Bodo 示例:来自
sub(/shop[[:space:]]*\(".*"\)/,"shop(\""a[int(x1%(54*2)/1)+0]"\")")) {x1++}; if (sub(/house[[:space:]]*\(.*\)/,"house("a[int(x2%(54*2)/1)+0]")")) {x2++}的所有输出都应存储在$h变量中,然后在cat $h | grep 'house'中使用。恐怕如果我使用一个简单的示例不适用于我的实际 AWK 命令所拥有的其他示例,但我会尝试用更少的示例来更新问题 -
@Bodo 真正处理
AWK中的变量可以是一个简单的替代方案,以防使用system ("cat $h | grep 'house'")?我会尝试这样做并进行一些测试。 -
@Bodo 是的
$h行使与a.txt相同的功能。 -
请edit您的问题添加信息/澄清,而不是为此目的使用 cmets。目前还不清楚为什么您需要变量。现在更不清楚您是想要一个 shell 变量还是一个 AWK 变量。如果可能,应避免在 AWK 脚本中使用
system。可能它可以在 AWK 中实现。您的示例system命令的目的尚不清楚。它将更新文件的时间戳或创建空文件。cat $h期望 shell 变量h包含 文件名 并将键入此文件。cat file | grep pattern与grep pattern file相同
标签: shell variables awk output