Si j'ai un long fichier texte et que je veux afficher toutes les lignes dans lesquelles un motif donné se produit, je fais:
grep -n form innsmouth.txt | cut -d : -f1
Maintenant, j'ai une séquence de chiffres (un numéro par ligne)
Je voudrais faire une représentation graphique 2D avec l'occurrence sur l'axe des x et le numéro de ligne sur l'axe des y. Comment puis-je atteindre cet objectif?
Vous pouvez utiliser gnuplot
pour cela:
primes 1 100 |gnuplot -p -e 'plot "/dev/stdin"'
produit quelque chose comme
Vous pouvez configurer l'apparence du graphique à votre guise, la sortie dans différents formats d'image, etc.
Je le ferais dans R
. Vous devrez l'installer mais il devra être disponible dans vos référentiels de distributions. Pour les systèmes basés sur Debian, exécutez
Sudo apt-get install r-base
Cela devrait également apporter r-base-core
mais si ce n'est pas le cas, exécutez Sudo apt-get install r-base-core
ainsi que. Une fois que vous avez installé R
, vous pouvez écrire un simple script R pour cela:
#!/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()
Le script ci-dessus créera un fichier appelé output.pdf
. J'ai testé comme suit:
## 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
Sur les données aléatoires que j'ai utilisées, cela produit:
Je ne suis pas tout à fait sûr de ce que vous voulez tracer mais cela devrait au moins vous orienter dans la bonne direction.
S'il se peut qu'une impression de terminal très simple suffise et que vous puissiez être satisfait par des axes inversés, considérez ce qui suit:
seq 1000 |
grep -n 11 |
while IFS=: read -r n match
do printf "%0$((n/10))s\n" "$match"
done
Le graphique ci-dessus montre une tendance inversée sur une échelle de 10% pour chaque occurrence du modèle 11 dans la sortie de seq 1000
.
Comme ça:
11
110
111
112
113
114
115
116
117
118
119
211
311
411
511
611
711
811
911
Avec les points et le nombre d'occurrences, cela pourrait être:
seq 1000 |
grep -n 11 | {
i=0
while IFS=: read -r n match
do printf "%02d%0$((n/10))s\n" "$((i+=1))" .
done; }
... qui imprime ...
01 .
02 .
03 .
04 .
05 .
06 .
07 .
08 .
09 .
10 .
11 .
12 .
13 .
14 .
15 .
16 .
17 .
18 .
19 .
Vous pourriez obtenir les axes comme votre exemple avec beaucoup plus de travail et tput
- vous auriez besoin de faire le \033[A
escape (ou son équivalent compatible avec votre émulateur de terminal) pour déplacer le curseur d'une ligne vers le haut pour chaque occurrence.
Si awk
de printf
prend en charge le remplissage d'espace comme le POSIX-Shell printf
, alors vous pouvez l'utiliser pour faire de même - et probablement beaucoup plus efficacement également. Cependant, je ne sais pas comment utiliser awk
.
Améliorer la réponse de Nate pour avoir PDF et tracer des lignes (nécessite le rsvg-convert
):
| gnuplot -p -e 'set term svg; set output "|rsvg-convert -f pdf -o out.pdf /dev/stdin"; plot "/dev/stdin" with lines'
Ou vous pouvez rediriger les données standard via le canal vers un script python personnalisé. Cela vous permettra une immense quantité de personnalisation et de flexibilité dans l'analyse, le prétraitement et la visualisation des données.
Voici un tutoriel sur ce que j'ai écrit pour faire exactement comme vous le souhaitez. lien