2012-08-31 167 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] 

或許你可以從它那裏得到一些啓發......