AWK初学者条形图/直方图

时间:2018-02-21 02:22:44

标签: linux unix awk terminal

我已经被合理地分配了这个提示我的第一个真正的NSString *docFolder = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0]; NSString *path = [docFolder stringByAppendingPathComponent:@"jorg.csv"]; NSData *myData = [NSData dataWithContentsOfFile:path]; 程序,我甚至不知道从哪里开始。任何帮助入门将非常感激。

编写一个名为awk的awk程序,该程序读取数字文件并打印出现的直方图。对于下面显示的输入:

hist.awk

输出将是:

1
4
5
0
2
4
6
8
1
3
2
4
6
7
2
3
3
4
4

第一列包含文件中的数字。第二个包含该数字发生的次数。图表显示总数的百分比,缩放为50,因此50个星号表示100%,25个星号表示50%,依此类推。

3 个答案:

答案 0 :(得分:4)

请问您可以尝试关注awk并告诉我这是否对您有所帮助(虽然我仍然不确定您的*输出中的打印):

awk 'function astrick_printing(var){;num=val=count="";count=((var*100)/50);while(++num<=count){val=val "*"};return val;} {a[$0]++} END{for(i in a){print i,a[i],astrick_printing(a[i])}}'  Input_file | sort

现在添加上述解决方案的非单一衬里形式:

awk '
function astrick_printing(var){
  num=val=count="";
  count=((var*100)/50);
  while(++num<=count){
    val=val "*"};
  return val
}
{
  a[$0]++
}
END{
  for(i in a){
    print i,a[i],astrick_printing(a[i])}
}
'  Input_file | sort

输出如下:

0 1 **
1 2 ****
2 3 ******
3 3 ******
4 5 **********
5 1 **
6 2 ****
7 1 **
8 1 **

答案 1 :(得分:2)

另一个awk

 $ awk '{a[$1]++; c++} 
     END{for(k in a) 
           {s=sprintf("%*s",a[k]*50/c,FS); 
            gsub(FS,"*",s); 
            print k":", a[k], s}}' file


0: 1 **
1: 2 *****
2: 3 *******
3: 3 *******
4: 5 *************
5: 1 **
6: 2 *****
7: 1 **
8: 1 **

答案 2 :(得分:2)

以下awk行执行请求:

  • 它做了一个圆形的计数圆形以获得正确的星星(4.5星=> 5星,4.2星= 4星)
  • 内存中有一个50 *的字符串,只打印所需的部分。它使用格式说明符.ws执行此操作,其中w替换为int(a[i]*50/c+0.5)
  • 跟踪记录的最小和最大数量。任何未出现在该范围内的数字都将打印0星。

该脚本显示:

awk 'BEGIN{imin=+999999;imax=-99999;
           stars="**************************************************"
     }
     {a[$1]++;imin=$i<imin?$i:imin; imax=$i>imax?$i:imax}
     END{ for(i=imin;i<=imax;i++) 
             printf "%3d: %-4d %.*s\n",i,a[i],int(a[i]*50/NR+0.5),stars    
     }' file.txt

和输出:

  0: 1    ***
  1: 2    *****
  2: 3    ********
  3: 3    ********
  4: 5    *************
  5: 1    ***
  6: 2    *****
  7: 1    ***
  8: 1    ***

一切都基于printf format modifiers。要打印的格式为

%3d: %-4d %.*s\n

其中包括:

  • %3d)打印宽度为3的整数
  • -4d)打印宽度为4左对齐的整数
  • %.*s)是%.ws的变体,表示打印字符串的第一个w字符。 w的值(由*表示)从参数列表中获取。

如果您不关心列表中没有出现的数字(例如,您的文件有10但不是9,那么上面会有一行9: 0作为输出。如果您不关心这一点,那么您可以这样做:

awk 'BEGIN{ PROCINFO["sorted_in"]="@ind_num_asc"
            stars="**************************************************" }
     {a[$1]++}
     END{ for(i in a) 
              printf "%3d: %-4d %.*s\n",i,a[i],int(a[i]*50/NR+0.5),stars
     }' file.txt

需要PROCINFO["sorted_in"]="@ind_num_asc"来确保有序遍历a的索引。但这是一个gawk extension