如何根据标准输入绘制一系列数字的图形?

如何根据标准输入绘制一系列数字的图形?

如果有一个很长的文本文件,并且我想显示出现给定模式的所有行,我会这样做:

grep -n form innsmouth.txt | cut -d : -f1

现在,我有一个数字序列(每行一个数字)

我想制作一个 2D 图形表示,其中 x 轴上出现的次数和 y 轴上的行号。我怎样才能实现这个目标?

在此输入图像描述

答案1

你可以使用gnuplot为了这:

 primes 1 100 |gnuplot -p -e 'plot "/dev/stdin"'

产生类似的东西

在此输入图像描述

您可以根据自己的喜好配置图表的外观、以各种图像格式输出等。

答案2

我会在R.您必须安装它,但它应该在您的发行版存储库中可用。对于基于 Debian 的系统,运行

sudo apt-get install r-base

这也应该引入,r-base-core但如果没有引入,sudo apt-get install r-base-core也可以运行。安装完成后R,您可以为此编写一个简单的 R 脚本:

#!/usr/bin/env Rscript
args <- commandArgs(TRUE)
## Read the input data
a<-read.table(args[1])
## Set the output file name/type
pdf(file="output.pdf")
## Plot your data
plot(a$V2,a$V1,ylab="line number",xlab="value")
## Close the graphics device (write to the output file)
dev.off()

上面的脚本将创建一个名为output.pdf.我测试如下:

## Create a file with 100 random numbers and add line numbers (cat -n)
for i in {1..100}; do echo $RANDOM; done | cat -n > file 
## Run the R script
./foo.R file

根据我使用的随机数据,产生:

在此输入图像描述

我不完全确定你想要绘制什么,但这至少应该为你指明正确的方向。

答案3

如果一个非常简单的终端打印输出就足够了,并且您可以通过倒轴来满足,请考虑以下事项:

seq 1000   |
grep -n 11 |
while IFS=: read -r n match
do  printf "%0$((n/10))s\n" "$match"
done

上图针对该模式的每次出现绘制了 10% 比例的反转趋势11在 的输出中seq 1000

像这样:

11
        110
        111
        112
        113
        114
        115
        116
        117
        118
        119
                  211
                            311
                                      411
                                                511
                                                          611
                                                                    711
                                                                              811
                                                                                        911

对于点和出现次数,它可能是:

seq 1000    |
grep -n 11  | {
i=0
while IFS=: read -r n match
do    printf "%02d%0$((n/10))s\n" "$((i+=1))" .
done; }

...打印...

01 .
02           .
03           .
04           .
05           .
06           .
07           .
08           .
09           .
10           .
11           .
12                     .
13                               .
14                                         .
15                                                   .
16                                                             .
17                                                                       .
18                                                                                 .
19                                                                                           .

你可以通过更多的工作来获得像你的例子一样的轴tput- 你需要进行\033[A转义(或与您的终端模拟器兼容的等效项)每次出现时将光标向上移动一行。

如果awk'sprintf像 POSIX-shell 一样支持空格填充printf,那么您可以使用它来执行相同的操作 - 并且可能也更有效。然而,我不知道如何使用awk

答案4

增强 Nate 的答案以提供 PDF 输出和绘制线条(需要rsvg-convert):

| gnuplot -p -e 'set term svg; set output "|rsvg-convert -f pdf -o out.pdf /dev/stdin"; plot "/dev/stdin" with lines'

相关内容