计算文件中 awk 输出搜索的每个字符串

计算文件中 awk 输出搜索的每个字符串

我会尽量具体、清晰。

我有一个文件: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

相关内容