2012-09-11 32 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

非常感谢你的所有解释。 –