2012-08-31 124 views
2

这里是我的问题如何在awk中使用bash命令

我有一个文件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的应该是这样的:。

  • 搜索模式在文件2
  • 当awk得到它,awk调用一个从File1返回想要的值的脚本。
  • 然后AWK可以编辑文件2

不要犹豫,给我解释一下其他的可能性,如果有这是更简单!

谢谢!

+0

目前尚不清楚你想要什么,你需要提供输入和预期输出的明确例子。 – Thor

+0

你需要什么比我已经给了? – n0n0bstan

+0

我不认为“叠瓦”是指你怎么想它的意思。我会使用“包含”或“合并”。 –

回答

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] - 使用分割得到的两个值打印一些文本。
+0

我试试这个方法,我告诉你,但它似乎正是我寻找!谢谢 ! – n0n0bstan

+0

请回答以下问题:“如何在awk中使用bash命令” –

+1

@NoémienKocher:AWK具有'system()'函数,因此您可以这样做,例如'awk'BEGIN {system(“echo $ BASH_VERSION “)}'。你也可以通过管道向Bash发送命令:'awk'BEGIN {print“echo $ BASH_VERSION”| “/斌/庆典”;关闭(“/ bin/bash”)}''。你也可以使用'getline'来捕获命令的输出:'awk'BEGIN {cmd =“echo $ BASH_VERSION”; while((cmd | getline result)> 0){打印结果};关闭(CMD)}''。 –

5

这是我从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] 

或许你可以从它那里得到一些启发......