표준 입력을 기반으로 일련의 숫자를 그래프로 표시하는 방법은 무엇입니까?

표준 입력을 기반으로 일련의 숫자를 그래프로 표시하는 방법은 무엇입니까?

긴 텍스트 파일이 있고 특정 패턴이 나타나는 모든 줄을 표시하려면 다음을 수행합니다.

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

이제 일련의 숫자가 있습니다(행당 하나의 숫자).

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(또는 터미널 에뮬레이터와 호환되는 동급)커서가 나타날 때마다 커서를 한 줄 위로 이동합니다.

공백 패딩을 지원하는 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'

관련 정보