긴 텍스트 파일이 있고 특정 패턴이 나타나는 모든 줄을 표시하려면 다음을 수행합니다.
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
경우 이를 사용하여 동일한 작업을 수행할 수 있으며 아마도 더 효율적일 수도 있습니다. 그러나 어떻게 사용하는지 모르겠습니다 .printf
printf
awk
답변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'