長いテキストファイルがあり、特定のパターンが発生するすべての行を表示する場合、次のようにします。
grep -n form innsmouth.txt | cut -d : -f1
これで、一連の数字(1行に1つの数字)ができました
x軸にオカレンスを、y軸に行番号を使用して2Dグラフィック表示を作成したいと思います。どうすればこれを達成できますか?
長いテキストファイルがあり、特定のパターンが発生するすべての行を表示する場合、次のようにします。
grep -n form innsmouth.txt | cut -d : -f1
これで、一連の数字(1行に1つの数字)ができました
x軸にオカレンスを、y軸に行番号を使用して2Dグラフィック表示を作成したいと思います。どうすればこれを達成できますか?
回答:
gnuplot
これに使用できます:
primes 1 100 |gnuplot -p -e 'plot "/dev/stdin"'
のようなものを生成します
グラフの外観を思いのままに設定したり、さまざまな画像形式で出力したりできます。
gnuplot
かgnuplot-x11
?前者の場合、対話型のプロットを直接画面に表示するのではなく、ファイル出力(つまり、pdf、pngなどのファイルを生成する)のみを提供します。
seq 100 >seq.dat
から、gnuplot
対話形式でプロンプトタイプで実行するとplot "seq.dat"
どうなりますか?
Failed to initialize wxWidgets.
gnuplot-x11でエラーが発生しました...どちらかが必要ですか?または両方gnuplot
をgnuplot-x11
インストールできますか?
notitle
タイトルなしでプロットに追加します。
私はこれをで行い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
私が使用したランダムデータでは、次の結果が生成されます。
私はあなたが何をプロットしたいのか完全にはわかりませんが、それは少なくともあなたを正しい方向に向けるべきです。
#!/usr/bin/env Rscript; args <- commandArgs(TRUE); a<-read.table(args[1]); plot(a$V2,a$V1,ylab="line number",xlab="value");
で、同じディレクトリにRplots.pdfを生成できます 。
非常に単純な端末印刷で十分であり、逆軸で満足できる場合は、次のことを考慮してください。
seq 1000 |
grep -n 11 |
while IFS=: read -r n match
do printf "%0$((n/10))s\n" "$match"
done
上記のチャートは、の出力でパターン11が出現するたびに10%スケールで反転した傾向を示しています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
を行うことで、例のような軸を取得できます。また、発生するたびにカーソルを1行上に移動する\033[A
ために、エスケープ(またはターミナルエミュレータと互換性のある同等のもの)を行う必要があります。
場合awk
のprintf
POSIXシェルのようなサポートスペースパディングをprintf
行い、その後、あなたは同じことを行うためにそれを使用することができます-そしておそらくはるかに効率的にも。ただし、の使用方法はわかりませんawk
。
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'