【问题标题】:How to use a bash command in awk如何在 awk 中使用 bash 命令
【发布时间】:2014-09-26 03:19:42
【问题描述】:

这是我的问题

我有一个文件 1,其中有一些数据

Var1.1   Var1.2   Var1.3
Var2.1   Var2.2   Var2.3
Var3.1   Var3.2   Var3.3

由于上述数据,我有一个文件 2,我想编辑它

文件2 (1)

***pattern with Var2.1***
some text...

文件2(2)

***pattern with Var2.1***
Here I want to add Var2.2 and Var2.3
some text

我的第一个解决方案是使用 AWK,但我不知道在其中包含 bash 命令。AWK 应该是这样的:

  • 在 File2 中搜索模式
  • 当 awk 得到它时,awk 调用一个脚本,该脚本从 File1 返回所需的值。
  • 然后awk可以编辑File2

如果有更简单的可能性,请不要犹豫,向我解释其他可能性!

谢谢!

【问题讨论】:

  • 不清楚你想要什么,你需要提供输入和预期输出的明确示例。
  • 除了我已经给的以外,你还需要什么?
  • 我不认为“覆盖”意味着你认为它的意思。我会使用“包含”或“合并”。

标签: linux bash awk


【解决方案1】:

这是我在 awk 中运行外部命令以对字符串进行 base64 解码的方式:

cmd = "/usr/bin/base64 -i -d <<< " $2 " 2>/dev/null"
while ( ( cmd | getline result ) > 0 ) { }
close(cmd)
split(result, a, "[:=,]")
name=a[2]

或许你能从中得到一些启发……

【讨论】:

    【解决方案2】:

    无需运行外部脚本即可完成您的任务。它可以完全在一个简短的 AWK 脚本中完成。

    awk 'FNR == NR {arr[$1] = $2 " " $3; next} {print; for (lookup in arr) {if ($0 ~ lookup) {split(arr[lookup], a); print "Here I want to add " a[1] " and " a[2]}}}' File1 File2
    

    解释:

    • FNR == NR {arr[$1] = $2 " " $3; next} - 遍历第一个文件并将所有值保存在由第一列索引的数组中。记录号等于第一个文件的文件记录号。
    • print - 打印每一行输入。
    • for (lookup in arr) {if ($0 ~ lookup) { - 遍历每个数组索引并查看输入行是否匹配。
    • split(arr[lookup], a) - 将存储在匹配索引处的值拆分为临时数组。
    • print "Here I want to add " a[1] " and " a[2] - 使用拆分产生的两个值打印一些文本。

    【讨论】:

    • 我试试这个方法,我告诉你,但这似乎是我正在寻找的!谢谢!
    • 请回答问题:“如何在 awk 中使用 bash 命令”
    • @NoémienKocher:AWK 具有 system() 函数,因此您可以使用 awk 'BEGIN {system("echo $BASH_VERSION")} 为例。您还可以通过管道向 Bash 发送命令:awk 'BEGIN { print "echo $BASH_VERSION" | "/bin/bash"; close("/bin/bash") }'。您还可以使用getline 捕获命令的输出:awk 'BEGIN { cmd = "echo $BASH_VERSION"; while ( (cmd | getline result) &gt; 0 ) { print result }; close(cmd)}'
    猜你喜欢
    • 2017-11-25
    • 2013-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-21
    • 2020-06-30
    • 1970-01-01
    相关资源
    最近更新 更多