列出唯一并计算字符串后的第一个数字匹配

List unique and count the first numberic match after a string

我想在特定字符串后列出每个唯一数字,并计算该数字在文件中出现的次数。具体的字符串是 'length' 和它后面的第一个数字。

当前数据例如:

*random string* length: 40
*random string* length: 54
*random string* length: 40
*random string* length: 60
*random string* length: 60
*random string* length: 60

理想的结果是:

length 40: 2
length 54: 1
length 60: 3

目前我正在编写脚本来计算我在 24,111 行文件中手动看到的每个数字,这是不切实际的。

cat file.txt | awk '/length: 60/ {total++} END {print total}'

使用您展示的示例,请尝试以下 awk 代码。

awk '
match([=10=],/length: [0-9]+/){
  cnts[substr([=10=],RSTART,RLENGTH)]++
}
END{
  for(key in cnts){
    print key": "cnts[key]
  }
}
' Input_file

解释: 使用 match 函数匹配所有行中的字符串 length: digits 然后用第二个创建数组字段并继续将其值添加到同一索引。在 END 代码块中,根据显示的要求输出打印索引和数组值。

如果您不关心计数在输出中出现的位置:

$ sed 's/.*\(length\)://' file | sort | uniq -c
      2 length 40
      1 length 54
      3 length 60

或者如果您需要问题中的输出格式:

$ sed 's/.*\(length\)://' file | sort | uniq -c | awk '{print , ":", }'
length 40: 2
length 54: 1
length 60: 3

这可能对你有用 (GNU sed):

sed -E 's/.* (\S+:.*)/ 1/;H;x;s/(\n[^:]*: \S+ )(\S+)(.*).*$/$((+1))/
        x;$!d;x;s/.(.*)/echo ""/e' file

从每行的开头删除垃圾并添加一个计数器。

将修改后的行附加到保留 space 并在该行已存在的情况下增加计数器(删除重复行),然后删除当前行。

在文件末尾,切换到保留 space,删除保留开始处引入的换行符 space,创建回显命令并对其求值。