如何从awk获取总列数

时间:2012-09-11 15:19:50

标签: awk

我正在测试awk并得到了这个想法。所以我们知道

raja@badfox:~/Desktop/trails$ cat num.txt
1   2   3   4
1   2   3   4
4   1   2   31
raja@badfox:~/Desktop/trails$ awk '{ if ($1 == '4') print $0}' num.txt
4   1   2   31
raja@badfox:~/Desktop/trails$ 

所以命令将在文件名num.txt中的第1列检查4。

所以现在我想要输出,因为第4列也有一个4,例如,如果我有100列信息,我想得到输出为我搜索的术语有多少列。

我的意思是从上面的例子我想要第4列和第1列作为输出,我正在搜索4。

2 个答案:

答案 0 :(得分: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 }'

这为包含搜索值4的每列设置(关联)数组元素column[i]为1.最后的循环以不确定(未排序)的顺序打印包含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 }'

答案 1 :(得分: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
}