如果有一个很长的文本文件,并且我想显示出现给定模式的所有行,我会这样做:
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'