सिर / पूंछ पर नकारात्मक तर्क


14

इस प्रश्न के वेरिएंट को निश्चित रूप से विभिन्न स्थानों में कई बार पूछा गया है, लेकिन मैं Mभाग्य के बिना एक फ़ाइल से अंतिम लाइनों को हटाने की कोशिश कर रहा हूं ।

दूसरा सबसे मतदान जवाब में इस सवाल के बाद एक फ़ाइल में अंतिम पंक्ति से छुटकारा पाने के लिए क्या कर रही सिफारिश:

head -n -1 foo.txt > temp.txt

हालाँकि, जब मैं कोशिश करता हूँ कि OSX और Zsh में, मुझे मिलता है:

head: illegal line count -- -1

ऐसा क्यों है? मैं कैसे निकाल सकते हैं M पिछले लाइनों और पहले N किसी दिए गए फ़ाइल की तर्ज?



1
का आउटपुट क्या है head --version? आप किस सिस्टम का उपयोग कर रहे हैं?
जोफेल

@jofel head --versionवास्तव में एक त्रुटि देता है।
एमिलियो वाज़क्वेज़-रीना

जवाबों:


20

आप पहली 12 पंक्तियों को हटा सकते हैं:

tail -n +13

(इसका मतलब है कि 13 वीं पंक्ति से प्रिंट।)

headGNU headसमर्थन जैसे कुछ कार्यान्वयन :

head -n -12

लेकिन यह मानक नहीं है।

tail -r file | tail -n +12 | tail -r

उन प्रणालियों पर काम करेगा जिनके पास tail -r(जीएनयू भी देखें tac) लेकिन उप-इष्टतम है।

n1 कहाँ है:

sed '$d' file

आप भी कर सकते हैं:

sed '$d' file | sed '$d'

2 लाइनों को हटाने के लिए, लेकिन यह इष्टतम नहीं है।

तुम कर सकते हो:

sed -ne :1  -e 'N;1,12b1' -e 'P;D'

लेकिन सावधान रहें कि कुछ कार्यान्वयन के साथ n के बड़े मूल्यों के साथ काम नहीं करेगा sed

के साथ awk:

awk -v n=12 'NR>n{print line[NR%n]};{line[NR%n]=$0}'

mशुरुआत और nअंत से लाइनें हटाने के लिए :

awk -v m=6 -v n=12 'NR<=m{next};NR>n+m{print line[NR%n]};{line[NR%n]=$0}'

sed 'x;1d;$d'अंतिम दो पंक्तियों को प्राप्त करने के लिए भी इस्तेमाल किया जा सकता है। और w / के एक जोड़े के Nबाद 1dसे थोड़ा अधिक पाने के लिए इस्तेमाल किया जा सकता है, हालांकि उस बिंदु पर यह N;P;Dआपके द्वारा पहले से सुझाए गए लूप पर कोई लाभ नहीं देता है ।
mikeserv

धन्यवाद - अंतिम आदेश बेहद मददगार है। एक छोटी सी गर्मी: यह काम नहीं करता है जब mया nकर रहे हैं 0। अन्यथा यह सही होगा।
एमिलियो वाज़केज़-रीना

2

आप पहले N लाइनों और अंतिम M लाइनों को हटाने के लिए निम्न तरीके का उपयोग कर सकते हैं।

साथ N=5, M=7और फ़ाइल test.txt:

sed -n -e "6,$(($(wc -l < test.txt) - 7))p" test.txt

कमांड N + 1 से लास्टलाइन-एम तक सभी लाइनों को प्रिंट करता है।

एक और विकल्प अजगर का उपयोग करना है:

python -c 'import sys;print "".join(sys.stdin.readlines()[5:-7]),' < test.txt

1

आप Mकिसी फ़ाइल से अंतिम (यहां M = 100) लाइनें निकाल सकते हैं :

head -$(($(wc -l < foo.txt) - 100)) foo.txt > temp.txt
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.