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」。
nanshi,我不清楚你想要達到的目標。 「儘可能找到第1列的最大頻率」(6個「3」的事件),但是「輔助功能」是什麼意思?你想對結果做什麼? – ghoti
@ghoti,幫手函數我的意思是一個awk腳本中的一個函數來執行子任務,例如找到第1列的最大頻率:) – trillions