我想使用linux命令了解列中唯一值的计数。该列的值如下所示(数据是从前一个值编辑的)。我需要最后忽略.M,.Q和.A,只计算唯一的植物数量
"series_id":"ELEC.PLANT.CONS_EG_BTU.56855-ALL-ALL.M"
"series_id":"ELEC.PLANT.CONS_EG_BTU.56855-ALL-ALL.Q"
"series_id":"ELEC.PLANT.CONS_EG_BTU.56855-WND-ALL.A"
"series_id":"ELEC.PLANT.CONS_EG_BTU.56868-LFG-ALL.Q"
"series_id":"ELEC.PLANT.CONS_EG_BTU.56868-LFG-ALL.A"
"series_id":"ELEC.PLANT.CONS_EG_BTU.56841-WND-WT.Q"
"series_id":"ELEC.CONS_TOT.COW-GA-2.M"
"series_id":"ELEC.CONS_TOT.COW-GA-94.M"
我已经尝试过此代码,但无法避免使用这些后缀
cat ELEC.txt | grep 'series_id' | cut -d, -f1 | wc -l
对于上述样本,预期计数应为6,但我得到8
答案 0 :(得分:2)
这应该可以完成:
grep -Po "ELEC.PLANT.*" FILE | cut -d. -f -4 | sort | uniq -c
sort | uniq -c
编辑:
对于新数据,只需要执行以下操作:
grep -Po "ELEC.*" FILE | cut -d. -f -4 | sort | uniq -c
答案 1 :(得分:1)
当您需要进行计数时,可以轻松地使用awk
进行计数。 Awk是一种用途非常广泛的工具,我强烈建议您看看它。也许从Awk one-liners explained开始。
话虽如此,您可以在此处轻松进行条件计数:
您想要的是计算其中包含series_id
的所有唯一行。
awk '/series_id/ && (! $0 in a) { c++; a[$0] } END {print c}'
这基本上说明:如果我的行包含“ series_id”,而我没有将行存储在数组a
中,则意味着我还没有遇到行,并增加了计数器c
1.在程序结束时,我打印计数c
。
现在您要稍微整理一下。您的兴趣线基本上看起来像
"something":"something else"
因此,如果something else
是字段分隔符,我们对第4个字段中的"
感兴趣,而我们仅对something
位于series_id
的情况感兴趣在字段2中。
awk -F'"' '($2=="series_id") && (! $4 in a ) { c++; a[$4] } END {print c}'
最后,您不必关心第四个字段的最后一个字母,因此我们需要做一个小替换:
awk -F'"' '($2=="series_id") { str=$4; gsub(/.$/,"",str); if (! str in a) {c++; a[str] } } END {print c}'
您还可以将其重写为:
awk -F'"' '($2 != "series_id" ) { next }
{ str=$4; gsub(/.$/,"",str) }
( str in a ) { next }
{ c++; a[str] }
END { print c }'
答案 2 :(得分:0)
我计算唯一值的标准方法是确保拥有值列表(在您的情况下使用grep
和cut
),并在管道后面添加以下命令:
| sort -n | uniq -c
sort
进行基于数字排序的排序,而uniq
获得唯一的条目(-c
代表“计数”)。
答案 3 :(得分:0)
执行此操作:app.post('/api/sandbox', function(req, res){
var hit = req.body.postman.kSent;
console.log(hit);
res.send(200); // Try to send response back to user
});
cat ELEC.txt | grep 'series_id' | cut -f1-4 -d. | uniq | wc -l
将删除每行的第四个-f1-4
答案 4 :(得分:0)
以下是使用awk
的解决方案:
awk 'BEGIN{FS="[:.\"]+"} /^"series_id":/{print $6}' \
ELEC.txt |sort -n |uniq -c
您发布的示例的输出将如下所示:
1 56841-WND-WT
2 56855-ALL-ALL
1 56855-WND-ALL
2 56868-LFG-ALL
如果需要整个字符串,则还可以打印其他字段:
awk 'BEGIN{FS="[:.\"]+"; OFS="."} /^"series_id":/{print $3,$4,$5,$6}' \
ELEC.txt |sort -n | uniq -c
输出将是这样的:
1 ELEC.PLANT.CONS_EG_BTU.56841-WND-WT
2 ELEC.PLANT.CONS_EG_BTU.56855-ALL-ALL
1 ELEC.PLANT.CONS_EG_BTU.56855-WND-ALL
2 ELEC.PLANT.CONS_EG_BTU.56868-LFG-ALL