列出唯一并计算字符串后的第一个数字匹配
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,创建回显命令并对其求值。
我想在特定字符串后列出每个唯一数字,并计算该数字在文件中出现的次数。具体的字符串是 '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,创建回显命令并对其求值。