2012-06-03 49 views
1

我沒有找到有關此主題的任何明確的教程。假設我有一個輸入文件:awk - 兩個腳本如何相互交互?

1 abc 
1 def 
1 ghi 
1 lalala 
1 heyhey 
2 ahb 
2 bbh 
3 chch 
3 chchch 
3 oiohho 
3 nonon 
3 halal 
3 whatever 

假設我想查找第一列出現的最大數目,即出現6次的「3」。然後,我需要將這個數字(即6)提供給另一個腳本來完成一些計算。有什麼辦法做到這一點?

基本上,我不知道是否有可能編寫一個函數來檢查文件,然後在調用輔助函數的主函數中找到「max」。另外,我想知道是否可以在助手函數中使用$(...)來調用'awk'或其他系統函數?

+0

nanshi,我不清楚你想要達到的目標。 「儘可能找到第1列的最大頻率」(6個「3」的事件),但是「輔助功能」是什麼意思?你想對結果做什麼? – ghoti

+0

@ghoti,幫手函數我的意思是一個awk腳本中的一個函數來執行子任務,例如找到第1列的最大頻率:) – trillions

回答

1
awk 'NR == FNR {nums[$1]++; next} ! flag {flag = 1; for (num in nums) {if (nums[i] > max) {max = nums[i]}}} {print max * $3}' filetomax filetoprocess 

這是破了多條線路:

awk ' 
    NR == FNR { 
     nums[$1]++; 
     next 
    } 
    ! flag { 
     flag = 1; 
     for (num in nums) { 
      if (nums[i] > max) { 
       max = nums[i] 
      } 
     } 
    } 
    { 
     print max * $3 
    } 
' filetomax filetoprocess 

在這裏,我們正在做同樣的操作,發現您seen before數字的最大。我們不是使用主塊和END塊,而是使用通常用於處理一個文件和另一個文件的技術。 NR == FNR條件只有在讀取第一個文件時纔是真實的,因爲所有文件中每條文件的每行增加的記錄編號(NR)等於爲每個新文件重置的文件記錄編號(FNR)。在與此條件相關的塊中,計算每個數字出現的次數。 next語句導致執行循環讀取文件中的下一行。當到達第二個文件時,條件不再爲真,並且該塊將被跳過。

下一個條件(! flag)將檢查變量的內容是否爲真。由於尚未設定,因此是錯誤的。感嘆號取消了條件,所以此時執行進入該塊。現在該標誌被設置爲在下一次檢查條件時,該塊將被跳過。 for循環檢查以查看哪個數字出現次數最多,就像我在回答您的其他問題時一樣。

現在,第二個文件可以按照您喜歡的任何方式進行處理,變量max可在此處理期間使用。我只是用一個print聲明來說明這一點。您仍可以像平常一樣使用塊選擇器條件,包括一個或多個END塊。我沒有顯示BEGIN塊,但您可以在此腳本的頂部添加一個用於任何需要的初始化。請注意,第一個文件的處理可能已在BEGIN塊中使用getline完成。這是完成同樣事情的另一種技術。

文件名按照它們要處理的順序列出。找到最大計數的文件稱爲「filetomax」。第二個文件,我做了主要處理我叫「filetoprocess」。

+0

這是一個非常詳細的解釋:)。非常感謝!我會試試這個。同時,你認爲Python比awk更好地執行這樣的任務嗎?祝你有美好的一天!並非常感謝您的幫助:) – trillions

+0

謝謝丹尼斯! :) – trillions

0

我們使用管道爲此。它將第一個進程的標準輸出連接到第二個進程的標準輸入。

awk ... | awk ...