मैं मानक इनपुट से संख्याओं के अनुक्रम का एक चित्रमय भूखंड कैसे बना सकता हूं?


38

यदि मेरे पास एक लंबी पाठ फ़ाइल है और मैं उन सभी पंक्तियों को प्रदर्शित करना चाहता हूं जिनमें एक दिया हुआ पैटर्न होता है, तो मैं करता हूं:

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

अब, मेरे पास संख्याओं का एक क्रम है (प्रति पंक्ति एक संख्या)

मैं x- अक्ष पर होने वाली घटना और y- अक्ष पर लाइन संख्या के साथ 2 डी चित्रमय प्रतिनिधित्व करना चाहूंगा। इसे कैसे प्राप्त किया जा सकता है?

यहाँ छवि विवरण दर्ज करें


1
क्या आप बता सकते हैं कि आपके होने का क्या मतलब है? क्या आपका मतलब है कि किसी विशेष नंबर को फाइल में कितनी बार पाया जाता है? या क्या आप केवल x- अक्ष पर संख्या का वास्तविक मान और उस संख्या को y- अक्ष पर पाया गया संख्या चाहते हैं?
terdon

मेरा मतलब है कि घटना के क्रम में एक पैटर्न मिला। उदाहरण: लाइन 400 में पहली बार, लाइन 410 में दूसरी बार, लाइन 412 में तीसरी बार ...
अब्दुल अल हज़्रेड

जवाबों:


44

आप इसके लिए उपयोग कर सकते हैं gnuplot:

 primes 1 100 |gnuplot -p -e 'plot "/dev/stdin"'

जैसा कुछ पैदा करता है

यहाँ छवि विवरण दर्ज करें

आप ग्राफ की उपस्थिति को अपने दिल की खुशी, विभिन्न छवि प्रारूपों में आउटपुट आदि से कॉन्फ़िगर कर सकते हैं।


2
मैंने gnuplot डाउनलोड किया है और इसे दर्ज करके परीक्षण करने की कोशिश की है: seq 100 | gnuplot -p -e 'plot "/ dev / stdin"'। विचित्र रूप से कोई ग्राफ़ दिखाई नहीं दिया, लेकिन बाहर निकलने का कोड (गूंज $?) 0 था, इसलिए कोई त्रुटि भी नहीं दिखाई दी।
अब्दुल अल हज्रेड

@AbdulAlHazred आपने स्थापित किया gnuplotया gnuplot-x11? यदि पूर्व में, यह केवल फाइल आउटपुट प्रदान करता है (यानी पीडीएफ, पीएनजी आदि फाइलें पैदा करता है ) स्क्रीन के लिए इंटरएक्टिव प्लॉट के बजाय।
स्टीलड्राइवर

@AbdulAlHazred: क्या होता है यदि आप बस करते हैं seq 100 >seq.dat, तो gnuplotअंतःक्रियात्मक रूप से और त्वरित प्रकार से चलाएं plot "seq.dat"?
नैट एल्ड्रेडगे

@steeldriver मेरे पास Failed to initialize wxWidgets.gnuplot-x11 के साथ एक त्रुटि है ... क्या मुझे एक या दूसरे की आवश्यकता है? या दोनों कर सकते हैं gnuplotऔर gnuplot-x11स्थापित किया जाना?
3kstc

1
बहुत अच्छा; संलग्न notitleशीर्षक के बिना प्लॉट करने के लिए।
विक्टोरिया स्टुअर्ट

13

मैं इसमें करूंगा R। आपको इसे स्थापित करना होगा लेकिन यह आपके वितरण रिपॉजिटरी में उपलब्ध होगा। डेबियन आधारित प्रणालियों के लिए, भागो

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

मेरे द्वारा उपयोग किए गए यादृच्छिक डेटा पर, जो उत्पादन करता है:

यहाँ छवि विवरण दर्ज करें

मुझे पूरी तरह से यकीन नहीं है कि आप क्या चाहते हैं लेकिन आपको कम से कम सही दिशा में इशारा करना चाहिए।


मेरा रुख v3.4.4, भले ही ggplot या कथानक का उपयोग करके डिफ़ॉल्ट रूप से प्लॉट्स.pdf उत्पन्न करता है।
वोरैक

@ वोरैक का क्या मतलब था कि आप दूसरे जवाब पर टिप्पणी कर सकते हैं? Ggplot का इससे क्या लेना-देना है? और डिफ़ॉल्ट आउटपुट फ़ाइल नाम प्रासंगिक क्यों है?
terdon

मेरे डेबियन सिस्टम पर आपकी स्क्रिप्ट का सबसेट #!/usr/bin/env Rscript; args <- commandArgs(TRUE); a<-read.table(args[1]); plot(a$V2,a$V1,ylab="line number",xlab="value");उसी निर्देशिका में Rplots.pdf उत्पन्न करने के लिए पर्याप्त है।
वोरैक

1
@Vorac हाँ, बिल्कुल। लेकिन मैं आउटपुट फाइल नाम चुनना चाहता हूं। और, अधिक महत्वपूर्ण बात यह है कि यह कैसे किया जा सकता है इसलिए इसे स्क्रिप्ट किया जा सकता है। अन्यथा, हर बार जब आप एक RScript चलाते हैं, तो यह एक ही नाम का उपयोग करेगा और एक अनमोल रन के आउटपुट को अधिलेखित करेगा।
terdon

11

यदि यह हो सकता है कि एक बहुत ही सरल टर्मिनल प्रिंटआउट पर्याप्त होगा, और यह कि आप उल्टे कुल्हाड़ियों से संतुष्ट हो सकते हैं, तो निम्नलिखित पर विचार करें:

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आपको प्रत्येक घटना के लिए कर्सर को स्थानांतरित करने के लिए \033[Aभागने (या इसके समकक्ष अपने टर्मिनल एमुलेटर के साथ संगत है) करने की आवश्यकता होगी।

अगर awkकी printfPOSIX-कवच की तरह समर्थन करता है अंतरिक्ष गद्दी printfकी संभावना कहीं अधिक कुशलता से और साथ ही और - करता है, तो आप इसे भी ऐसा ही करने के लिए उपयोग कर सकते हैं। मैं, हालांकि, उपयोग करने का तरीका नहीं जानता awk


1

पीडीएफ आउटपुट और प्लॉट लाइन (आवश्यकता rsvg-convert) के लिए नैट के उत्तर को बढ़ाना :

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

0

या आप एक कस्टम अजगर स्क्रिप्ट के लिए पाइप के माध्यम से डेटा को पुनर्निर्देशित कर सकते हैं। यह आपको डेटा को पार्स करने, प्री-प्रोसेसिंग और विज़ुअलाइज़ करने में अनुकूलन और लचीलेपन की प्रचुर मात्रा में अनुमति देगा।

यहाँ एक ट्यूटोरियल है इस पर मैंने लिखा है कि जैसा आप चाहते हैं वैसा ही करें। संपर्क

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.