我会尽量具体、清晰。
我有一个文件:log.txt
它包含多个字符串,我搜索这些字符串并对其进行打印和计数。
这是我的命令,仅打印文件中的列重合log.txt
:
sed -n '1p' log.txt | awk '{ s = ""; for(i = 25; i <= NF; i++) s = s $i "\n"; print s}'
解释
sed -n '1p' //prints the first line
awk '{ s = ""; for(i = 25; i <= NF; i++) s = s $i "\n"; print s}' //prints the next columns from the number 25 column
输入:
Column25 Column26 Column27 ColumnN <--#first filter:I need obtain specific headers. ColumnN
Column25 Column27 ColumnN
Column26 Column27 <--#Count how many times is repeat every string in whole file
输出:
Column25
Column26
Column27
Column28
Column29
ColumnN
我尝试这样做:
从前面的输出中,我想计算同一文件中file.log
同一命令中的所有巧合:
sed -n '1p' log.txt | awk '{ s = ""; for(i = 25; i <= NF; i++) s = s $i "\n"; print s}'
并再次发送到输出,例如:
期望的输出:
Column25 - n times
Column26 - n times
Column27 - n times
Column28 - n times
Column29 - n times
ColumnN - n times
附言。我考虑在 for 循环中使用相同的变量"$s"
来开始搜索,但不起作用。
答案1
这是我解决这个问题的方法:
awk '{n=1;if(NR==1)n=25;for(i=n;i<=NF;i++) a[$i]++} END{for(val in a) print val,a[val]}' input.txt
事实上,您想要捕获第一行中的字段 25 及之后的字段,需要我们检查NR
变量,并设置n
将在循环中使用的变量。至于a[$i]++
这将是一个关联数组,其中字段是键,数组中的值将通过++
运算符递增。这是awk中非常典型的字段计数方法。
答案2
怎么样
awk '{for (i=25; i<=NF; i++) print $i; exit}' file | sort | uniq -c
6 string1
6 string2
6 string3
6 string4
6 string5
6 stringN
编辑:在新添加的示例输入中,在计数开始之前没有 24 个字段需要忽略,并且对第一行的限制(从第一个代码片段推断)似乎也消失了。尝试
tr -s ' ' '\n' <file | sort | uniq -c
2 Column1
2 Column2
3 Column3
3 ColumnN