计算Unix上每行/每个字符的出现次数

too*_*oop 44 unix linux bash shell scripting

给定一个包含这样数据的文件(即stores.dat文件)

sid|storeNo|latitude|longitude
2tt|1|-28.0372000t0|153.42921670
9|2t|-33tt.85t09t0000|15t1.03274200
Run Code Online (Sandbox Code Playgroud)

什么是返回每行't'字符出现次数的命令?

例如.会回来:

count   lineNum
   4       1
   3       2
   6       3
Run Code Online (Sandbox Code Playgroud)

另外,要按字段出现次数来执行此操作,返回以下结果的命令是什么?

例如.第2列和字符't'的输入

count   lineNum
   1       1
   0       2
   1       3
Run Code Online (Sandbox Code Playgroud)

例如.第3列和字符't'的输入

count   lineNum
   2       1
   1       2
   4       3
Run Code Online (Sandbox Code Playgroud)

jay*_*ngh 46

要计算每行字符的出现次数,您可以执行以下操作:

awk -F'|' 'BEGIN{print "count", "lineNum"}{print gsub(/t/,"") "\t" NR}' file
count lineNum
4       1
3       2
6       3
Run Code Online (Sandbox Code Playgroud)

要计算每个字段/列的字符出现次数,您可以执行以下操作:

第2栏:

awk -F'|' -v fld=2 'BEGIN{print "count", "lineNum"}{print gsub(/t/,"",$fld) "\t" NR}' file
count lineNum
1       1
0       2
1       3
Run Code Online (Sandbox Code Playgroud)

第3栏:

awk -F'|' -v fld=3 'BEGIN{print "count", "lineNum"}{print gsub(/t/,"",$fld) "\t" NR}' file
count lineNum
2       1
1       2
4       3
Run Code Online (Sandbox Code Playgroud)
  • gsub()function的返回值是替换次数.所以我们用它来打印数字.
  • NR 保存行号,以便我们使用它来打印行号.
  • 为了打印特定字段的出现次数,我们创建一个变量fld并输入我们希望从中提取计数的字段编号.


Gab*_*urt 43

grep -n -o "t" stores.dat | sort -n | uniq -c | cut -d : -f 1
Run Code Online (Sandbox Code Playgroud)

几乎完全给出你想要的输出:

  4 1
  3 2
  6 3
Run Code Online (Sandbox Code Playgroud)

感谢@ raghav-bhushan grep -o提示,这是多么有用的旗帜.-n标志也包括行号.

  • +1不让我输入所有awk (3认同)
  • 我认为可以免除-n排序-输出不是按行号顺序排序吗? (3认同)
  • 这是一个更为优雅和通用的解决方案。 (2认同)
  • 太奇怪了,确切的命令在Mac上返回了“ 10 t”,“ 1 1”,“ 1 2”,“ 1 3”。 (2认同)

art*_*rtm 19

要计算每行字符的出现次数:

$ awk -F 't' '{print NF-1, NR}'  input.txt
4 1
3 2
6 3
Run Code Online (Sandbox Code Playgroud)

这会将字段分隔符设置为需要计数的字符,然后使用字段数大于分隔符数的事实.

要首先计算cut该列中特定列的出现次数:

$ cut -d '|' -f 2 input.txt | awk -F 't' '{print NF-1, NR}'
1 1
0 2
1 3

$ cut -d '|' -f 3 input.txt | awk -F 't' '{print NF-1, NR}'
2 1
1 2
4 3
Run Code Online (Sandbox Code Playgroud)