एडब्ल्यूके / द्वारा लाइन शुरुआत प्रतिस्थापन के लिए वेतन वृद्धि लाइन काउंटर कैसे करें…?


9

मैंने पहली बार SED ( sed "s/^/COUNTER \&/" /tmp/1.tex) के बारे में सोचा था, लेकिन यह एक ही लाइन के लिए डिज़ाइन किया गया है, और मैं खुद को अब तक इस तरह से सोचकर काउंटर को बढ़ा नहीं सकता awkक्योंकि मुझे gawkएकीकृत दृष्टिकोणों के साथ बहुत अच्छे अनुभव हैं । डेटा

What & South Dragon & North Dragon    & 5 \\ \hline
What & South Dragon & North Dragon    & 5 \\ \hline
What & South Dragon & North Dragon    & 5 \\ \hline

अपेक्षित उत्पादन

1 & What & South Dragon & North Dragon    & 5 \\ \hline
2 & What & South Dragon & North Dragon    & 5 \\ \hline
3 & What & South Dragon & North Dragon    & 5 \\ \hline

ओएस: डेबियन 8.5

जवाबों:


11

nl एक फ़ाइल की लाइनों की संख्या के लिए एक उपयोगिता है। उपयोग:

nl /path/to/file

आपके विशिष्ट मामले में:

$ nl  -s ' & ' input.txt                                                                                                 
     1 & What & South Dragon & North Dragon    & 5 \\ \hline
     2 & What & South Dragon & North Dragon    & 5 \\ \hline
     3 & What & South Dragon & North Dragon    & 5 \\ \hline

आप इसे प्रचार काउंटर और एम्परसेंड के साथ कैसे जोड़ सकते हैं? - - यह काउंटर के लिए काम करता है, लेकिन निश्चित नहीं है कि बाद के लिए भी।
लेओ लेपोल्ड हर्ट्ज़ '

3
nl -s ' &' /path/to/file-sनिर्दिष्ट करता है कि इनपुट फ़ाइल के शरीर से संख्याओं को क्या अलग करता है।
डोपघोटी

1
nlसे अलग है cat -nऔर उस में awkसमाधान यह डिफ़ॉल्ट रूप से खाली लाइनों की संख्या नहीं है
iruvar

10

यह हासिल करता है कि आप क्या कर रहे हैं के बाद। (जैसा awk '$0=NR" & "$0' filenameकि करता है , लेकिन यह थोड़ा गूढ़ है)

awk '{print NR,"&",$0}' filename
1 & What & South Dragon & North Dragon    & 5 \\ \hline
2 & What & South Dragon & North Dragon    & 5 \\ \hline
3 & What & South Dragon & North Dragon    & 5 \\ \hline

या यदि sedबेहतर हो, तो यह समान परिणाम देता है।

sed = filename | sed 'N;s/\n/ \& /'

perl दृष्टिकोण।

perl -pe '$_="$. & $_"' filename
perl -pe 's/^/$. & /' filename

आपको यह वाक्य रचना sed = filename | ...कैसी लगी ? - - मुझे नहीं पता था कि आप equalसिंबल का इस्तेमाल सिंबल के साथ कर सकते हैं । - - क्या आपका sedकथन गतिशील वातावरण में काम कर सकता है? कोई कमजोरी?
लेओ लेपोल्ड हर्ट्ज़ '

1
@ LéoLéopoldHertz, मैंने मैन पेज के नीचे देखा, =ऑपरेटर "जीरो- या वन-एड्रेस कमांड्स" सेक्शन के अंतर्गत है।
सर्गी कोलोडियाज़नी

हाँ, = Print the current line number। तो यह सुविधा वास्तव में अंतर्निहित सेड है। अच्छा!
लेओ लेपोल्ड हर्ट्ज़ '

3

पायथन इसके लिए एक अच्छा वैकल्पिक उपकरण हो सकता है:

$ python -c "import sys;lines=[str(i)+' & '+l for i,l in enumerate(sys.stdin,1)]; print ''.join(lines)" < input.txt      
1 & What & South Dragon & North Dragon    & 5 \\ \hline
2 & What & South Dragon & North Dragon    & 5 \\ \hline
3 & What & South Dragon & North Dragon    & 5 \\ \hline

जिस तरह से यह काम करता है वह यह है कि हम पाठ को अजगर के स्टड में पुनर्निर्देशित करते हैं, और वहां से लाइनें पढ़ते हैं। enumerate()फ़ंक्शन वह है जो sys.stdinइनपुट के रूप में निर्दिष्ट के साथ लाइन काउंट देता है, और 1शुरुआती सूचकांक है। बाकी सरल है - हम कास्टिंग द्वारा इंडेक्स द्वारा नए तारों की सूची बनाते हैं क्योंकि स्ट्रिंग स्ट्रिंग के साथ ' & 'जुड़ती है, और स्वयं लाइन। अंत में, वह सब जो ''.join()फ़ंक्शन द्वारा सूची से पुन: परीक्षण में लिया गया है।

वैकल्पिक रूप से, यहाँ एक स्क्रिप्ट फ़ाइल के लिए या पठनीयता के लिए एक बहु-लाइन संस्करण है:

#!/usr/bin/env python
import sys

for index,line in enumerate(sys.stdin,1):
    print str(index) + ' & ' + line.strip()

सिर्फ एक ही काम करता है:

$ ./line_counter.py  < input.txt                                                                                         
1 & What & South Dragon & North Dragon    & 5 \\ \hline
2 & What & South Dragon & North Dragon    & 5 \\ \hline
3 & What & South Dragon & North Dragon    & 5 \\ \hline

लेकिन अगर आप इसे बाश में करना पसंद करते हैं, तो यह किया जा सकता है:

$ counter=1; while read line ; do printf "%s & %s\n" "$counter" "$line" ; counter=$(($counter+1)) ; done < input.txt
1 & What & South Dragon & North Dragon    & 5 \ hline
2 & What & South Dragon & North Dragon    & 5 \ hline
3 & What & South Dragon & North Dragon    & 5 \ hline

1
@ LéoLéopoldHertz if ठीक है, अगर मुझे लगता है कि ऐसा करने के लिए बिना, मुझे एक चर की आवश्यकता होगी जो लाइनों की संख्या को ट्रैक करता है, और मुझे उस चर को शुरू करने की आवश्यकता है, और हर बार वेतन वृद्धि। का उपयोग कर enumerate()कोड की 3 लाइनों की तरह बचाता है। यह अन्य चीजों से निपटने में उपयोगी है, जैसे सूचियों में आइटम संसाधित करना। देखें docs.python.org/2/library/functions.html#enumerate
सर्गी Kolodyazhnyy

@ LéoLéopoldHertz understand यदि आप काउंटर का उपयोग करना समझते हैं जैसे मैं bashउदाहरण में करता हूं , तो उपयोग करने के लिए स्वतंत्र महसूस करें :) मैं अनुभव enumerate()से अधिक सुरुचिपूर्ण पाया , लेकिन यह सिर्फ मेरी राय है। हर तरह से, अन्य विधि का उपयोग करें यदि आपको लगता है कि यह अधिक स्पष्ट है
Sergiy Kolodyazhnyy

ठीक है, enumerateचर तात्कालिकता से स्पष्ट है। क्या लंबोदर अभिव्यक्ति कुछ जगह बचा सकती है?
लेओ लेपोल्ड हर्ट्ज़ '

@ LéoLéopoldHertz save यह एक लंबी स्क्रिप्ट में जगह बचा सकता है, लेकिन इस मामले में, मैं सिर्फ यह नहीं देखता कि यह कैसे मदद कर सकता है।
सेर्गेई कोलोडियाज़नी

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