2014-01-13 50 views
1

我試圖在大數據文件中計算包含數字的字符串,併爲此使用「for i循環」來連續搜索它們。這裏是我的代碼:如何在awk中使用for循環搜索模式

#!/bin/bash 
for ((i=2; i<=253; i++)) 
do 
awk -F "\t" '$3 ~ /^names.i$/ {++c} END {print c}' myfile >> output.txt 
done 

由於某些原因,雖然使用awk只給出正確的輸出,但腳本在shell中只產生空的空間。我做錯了什麼?

回答

3

只是整個事情在1個AWK調用:

awk -F '\t' ' 
{ split($3,arr,/\./); ++c[arr[2]] } 
END { for (i=2;i <= 253;i++) print c[i]+0 } 
' myfile > output.txt 
+1

非常感謝Ed,我一直在努力做到這一點,它的作用像一個魅力!非常感謝! – schekn

2

你不能直接在awk中使用shell變量i。通過它先awk的:

for ((i=2; i<=253; i++)) 
do 
    awk -v i=$i -F "\t" '$3 ~ "^names\." i "$" {++c} END {print c}' myfile >> output.txt 
done 
+0

謝謝,這個工作,雖然提出警告,並打印空的空間而不是零,所以我會和埃德莫頓的答案一起去。 – schekn

+1

警告是因爲在使用字符串來包含RE時需要雙重轉義字符,因爲字符串文字會被解析兩次,一次是讀取腳本,一次是執行時,所以您需要'\\。'而不是'\\。' .'。這些空格是因爲當'c'未被設置時,如果您想要獲取數字而不是空字符串輸出,則需要使用'print c + 0'或'printf'%d \ n「,c'。 –

+1

謝謝你的評論,現在我知道我(和其他人)做錯了什麼。 – schekn

1

試試這個

awk -F "\t" '{for (i=2;i<=253;i++) if ($3 ~ /^names.i$/) ++c} END {print c}' myfile 
+0

是的,我也試過,但由於某種原因,它只是給出空輸出:( – schekn

+0

你不能在一個文字regexp('/^names.i $ /')中包含一個變量('i') - 它是作爲字母i處理,就像該RE中的所有其他字母一樣 –