如何在awk中使用bash命令

时间:2012-08-31 08:33:06

标签: linux bash awk

这是我的问题

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

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

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

File2(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

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

谢谢!

2 个答案:

答案 0 :(得分:5)

这是我在awk中运行外部命令到base64-decode字符串的方法:

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

也许你可以从中获得灵感......

答案 1 :(得分:1)

无需运行外部脚本即可完成所需操作。它可以在一个简短的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] - 使用拆分产生的两个值打印一些文本。