【问题标题】:Save AWK output operation inside variable and use the variable after another bash command将 AWK 输出操作保存在变量中,并在另一个 bash 命令之后使用该变量
【发布时间】: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.txtb.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 patterngrep pattern file 相同

标签: shell variables awk output


【解决方案1】:
awk 'FNR==1 {++f; if(f>2) print ""}
     f==1   {a[NR]=$0; next}
     f==2 &&   FNR%2  {sub(/\(\)/,"(" a[int(FNR/2)+1] ")"); print}
     f==3 && !(FNR%2) {sub(/\(""\)/,"(\"" a[FNR/2+1] "\")"); print}' file1 file2 file3

house(anything1);
house(anything2);
house(anything3);

shop("anything2");
shop("anything3");
shop("anything4");

【讨论】:

  • 感谢您的帮助,但我仍然无法从您的回复中看到如何创建变量并从AWK 中使用它。我不太了解您的示例,显然它只是重现了输出需求,但我没有看到其中的变量,也没有看到 catgrep 命令。对不起我的无知。
  • 整个目的是消除变量,不需要 cat 或 grep,因为所有这些都可以在一个 awk 脚本中完成。
  • 我的问题是我真正需要的一个微观例子,这个问题的解决方案解决了我真正的宏观需求。但出于所有目的,有必要创建引用的变量以及能够使用它们的可能性。因此,我的帖子中的源文件和呈现的输出很小,但涵盖了必要和充分的特征,但这并不意味着我只想重现新方法的预期输出,我想要的是创建变量(如我提到了)以及使用它们的可能性
  • @7beggars_nnnnm 请编辑您的问题,而不是使用 cmets 添加信息。请添加背景信息为什么您认为您需要变量。你的真正的宏需要是什么?请描述正如我已经写过的,很难从 AWK 输出创建多个 shell 变量。可能有更好的解决方案。
猜你喜欢
  • 1970-01-01
  • 2010-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-01
相关资源
最近更新 更多