0

我正在测试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 的第一列检查 4 。

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

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

4

2 回答 2

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 的列号。GNUawk包括排序函数 ( asort, asorti);POSIXawk没有。如果排序顺序至关重要,请考虑:

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 }'
于 2012-09-11T15:31:18.403 回答
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
}
于 2012-09-11T15:23:13.743 回答