2012-09-11 30 views
0

我測試awk獲得總列,並得到了這個思想。所以我們知道如何從AWK

[email protected]:~/Desktop/trails$ cat num.txt 
1 2 3 4 
1 2 3 4 
4 1 2 31 
[email protected]:~/Desktop/trails$ awk '{ if ($1 == '4') print $0}' num.txt 
4 1 2 31 
[email protected]:~/Desktop/trails$ 

因此命令要在第一列的文件名num.txt檢查4。

所以現在我想輸出有4列也與例如4,如果我有信息100列,我希望得到的輸出,因爲我多少列有術語我尋找。

我從上面的例子中的意思是我想作爲輸出列4和列1和我尋找4。

+2

我用值4的提列3混淆...你能澄清這個問題(因爲我看不到第3列任何4)? –

+0

@JonathanLeffler對不起現在編輯,看起來很好 –

回答

1

您正在尋找NF變量。這是行中的字段數。

這裏有一個如何使用它的一個例子:

{ 
    if (NF == 8) { 
     print $3, $8; 
    } else if (NF == 9) { 
     print $3, $9; 
    } 
} 

或者一個循環內:

# This will print the line if any field has the value 4 
for (i=1; i<=NF; i++) { 
    if ($i == 4) 
     print $0 
} 
+0

新awk的,你可以把我怎麼也得使用它? –

+0

循環版本將爲每個包含4的列打印一行,這是過度殺傷,我想。 –

+0

@JonathanLeffler:你絕對正確。我只是想展示一個使用'NF'變量的例子。如果你覺得例子可以變得更好,通過各種手段做編輯它,改善它:) – rahmu

2

如果你正在努力尋找包含您的搜索項(在這種情況下,行,值爲4),並且您想要計算該行中出現多少個這樣的值(以及該行的數據),那麼您需要類似如下內容:

awk '{ count=0 
     for (i = 1; i <= NF; i++) if ($i == 4) count++ 
     if (count) print $i ": " $0 
    }' 

這並不完全符合一條SO線。

如果僅僅要識別哪些列包含搜索值,則可以使用:

awk '{ for (i = 1; i <= NF; i++) if ($i == 4) column[i] = 1 } 
    END { for (i in column) print i }' 

這設置(關聯)陣列元件column[i]爲1包含搜索值的每一列,4 。最後的循環打印包含4的列號,以不確定(不排序)的順序。 GNU awk包括排序函數(asortasorti); POSIX awk沒有。如果的排序順序是至關重要的,然後再考慮:

awk 'BEGIN { max = 0 } 
      { for (i = 1; i <= NF; i++) if ($i == 4) { column[i] = 1; if (i > max) max = i } } 
    END { for (i = 1; i <= max; i++) if (column[i] == 1) print i }' 
+0

非常感謝你的所有解釋。 –