我正在测试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。
答案 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
包括排序函数(asort
,asorti
); 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
}