標準入力に基づいて一連の数字をグラフ化するには?

標準入力に基づいて一連の数字をグラフ化するには?

長いテキストファイルがあり、特定のパターンが表示されるすべての行を表示するには、次の手順を実行します。

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

これで一連の数字があります(1行につき1つの数字)。

x軸に発生した回数、y軸に行番号を使用して2Dグラフィック表現を作成したいと思います。この目標をどのように達成できますか?

ここに画像の説明を入力してください。

答え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(または端末エミュレータと互換性のあるクラス)カーソルが表示されるたびに、カーソルを1行上に移動します。

空白のパディングをサポートするPOSIXシェルと同じawk場合は、これを使用して同じことを実行でき、おそらくより効率的です。しかし、どのように使用するのかわかりません。printfprintfawk

答え4

PDF出力を提供し、線を描くようにNateの回答を向上させます(必須rsvg-convert)。

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

関連情報