查找列中唯一值的数量

时间:2019-05-07 08:52:46

标签: linux

我想使用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

5 个答案:

答案 0 :(得分:2)

这应该可以完成:

grep -Po "ELEC.PLANT.*" FILE | cut -d. -f -4 | sort | uniq -c

  1. 您是“ ELEC.PLANT。”部分的第一个grep
  2. 删除 .Q,A,M
  3. 删除重复项并使用sort | uniq -c
  4. 进行计数

编辑: 对于新数据,只需要执行以下操作: 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)

我计算唯一值的标准方法是确保拥有值列表(在您的情况下使用grepcut),并在管道后面添加以下命令:

| 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