जवाबों:
आप इसका उपयोग पहली दो पंक्तियों को हटाने के लिए कर सकते हैं :
tail -n +3 foo.txt
और यह अंतिम दो पंक्तियों को स्ट्रिप करने के लिए :
head -n -2 foo.txt
(यह मानते हुए कि फ़ाइल \n
बाद के लिए समाप्त होती है )
बस के मानक उपयोग के लिए tail
और head
इन आपरेशनों विनाशकारी नहीं हैं। >out.txt
यदि आप आउटपुट को कुछ नई फ़ाइल पर पुनर्निर्देशित करना चाहते हैं तो उपयोग करें :
tail -n +3 foo.txt >out.txt
out.txt
पहले से मौजूद मामले में , यह इस फाइल को अधिलेखित कर देगा। का प्रयोग करें >>out.txt
बजाय >out.txt
आप बल्कि उत्पादन के साथ जोड़ दिया है चाहते हैं तो out.txt
।
head -n -2
POSIX संगत नहीं है ।
यदि आप सभी लेकिन पहली एन -1 लाइनों चाहते हैं, तो लाइनों tail
की संख्या के साथ कॉल करें +N
। (संख्या वह पहली पंक्ति है जिसे आप बनाए रखना चाहते हैं, 1 से शुरू होकर, +1 का मतलब शीर्ष पर शुरू होता है, +2 का अर्थ है एक पंक्ति और इसी तरह छोड़ें)।
tail -n +3 foo.txt >>other-document
अंतिम N लाइनों को छोड़ने का कोई आसान, पोर्टेबल तरीका नहीं है। GNU एक समकक्ष के रूप में head
अनुमति देता head -n +N
है tail -n +N
। अन्यथा, यदि आपके पास tac
(जैसे कि जीएनयू या बिजीबॉक्स) है, तो आप इसे पूंछ के साथ जोड़ सकते हैं:
tac | tail -n +3 | tac
आंशिक रूप से, आप एक awk फ़िल्टर का उपयोग कर सकते हैं (अप्रयुक्त):
awk -vskip=2 '{
lines[NR] = $0;
if (NR > skip) print lines[NR-skip];
delete lines[NR-skip];
}'
यदि आप किसी बड़ी फ़ाइल से अंतिम कुछ पंक्तियों को निकालना चाहते हैं, तो आप टुकड़े टुकड़े करने के लिए बाइट ऑफ़सेट का निर्धारण कर सकते हैं और फिर ट्रंकेशन को निष्पादित कर सकते हैं dd
।
total=$(wc -c < /file/to/truncate)
chop=$(tail -n 42 /file/to/truncate | wc -c)
dd if=/dev/null of=/file/to/truncate seek=1 bs="$((total-chop))"
आप शुरुआत में किसी फ़ाइल को काट नहीं सकते, हालाँकि यदि आपको किसी बड़ी फ़ाइल की पहली कुछ पंक्तियाँ निकालने की आवश्यकता है, तो आप सामग्री को इधर-उधर कर सकते हैं ।
से tail
आदमी पेज (जीएनयू tail
, कि है):
-n, --lines=K
output the last K lines, instead of the last 10; or use -n +K to
output lines starting with the Kth
इस प्रकार, निम्नलिखित सभी लेकिन पहले 2 लाइनों के somefile.txt
लिए संलग्न करना चाहिए anotherfile.txt
:
tail --lines=+3 somefile.txt >> anotherfile.txt
पहली n लाइनों को हटाने के लिए GNU sed का उपयोग किया जा सकता है। उदाहरण के लिए यदि n = 2
sed -n '1,2!p' input-file
!
मतलब है "इस अंतराल को बाहर"। जैसा कि आप कल्पना कर सकते हैं, अधिक जटिल परिणाम प्राप्त किया जा सकता है, उदाहरण के लिए
sed -n '3,5p;7p'
यह लाइन 3,4,5,7 दिखाएगा। अधिक शक्ति पतों के बजाय नियमित अभिव्यक्तियों के उपयोग से आती है।
सीमा यह है कि लाइनों की संख्या पहले से ज्ञात होनी चाहिए।
sed 1,2d
? सरलता आमतौर पर बेहतर होती है। इसके अलावा, आपके उदाहरणों में कुछ भी GNU Sed के लिए विशिष्ट नहीं है; आपके आदेश सेड के सभी मानक POSIX सुविधाओं का उपयोग करते हैं ।
जबकि tail -n +4
उत्पादन के लिए फ़ाइल 4 लाइन पर शुरू (सभी लेकिन पहले 3 लाइनों) मानक और पोर्टेबल है, इसके head
समकक्ष ( head -n -3
, सभी लेकिन पिछले 3 लाइनों) नहीं है।
आंशिक रूप से, आप करेंगे:
sed '$d' | sed '$d' | sed '$d'
या:
sed -ne :1 -e '1,3{N;b1' -e '}' -e 'P;N;D'
(सावधान रहें कि कुछ प्रणालियों पर जहां sed
सीमित आकार का एक पैटर्न स्थान है, जो बड़े मूल्यों के पैमाने पर नहीं है n
)।
या:
awk 'NR>3 {print l[NR%3]}; {l[NR%3]=$0}'
आशा है कि मुझे आपकी आवश्यकता स्पष्ट रूप से समझ में आ गई।
अपना अनुरोध पूरा करने के लिए आपके पास कई तरीके हैं:
tail -n$(expr $(cat /etc/passwd|wc -l) - 2) /etc/passwd
जहाँ / etc / passwd आपकी फ़ाइल है
यदि आपके पास बहुत बड़ी फ़ाइल है तो दूसरा समाधान उपयोगी हो सकता है:
my1stline=$(head -n1 /etc/passwd)
my2ndline=$(head -n2 /etc/passwd|grep -v "$my1stline")
cat /etc/passwd |grep -Ev "$my1stline|$my2ndline"
बीएसडी के लिए समाधान (macOS):
पहले 2 लाइनें निकालें:
tail -n $( echo "$(cat foo.txt | wc -l)-2" | bc )
अंतिम 2 लाइनें निकालें:
head -n $( echo "$(cat foo.txt | wc -l)-2" | bc )
... बहुत सुंदर नहीं है, लेकिन काम हो जाता है!
\n
" .. यह सब नकारात्मक पूर्णांक के अलावा अन्य के लिए काम करता है-n -0
जो देता है कुछ भी नहीं , बस के रूप में-n 0
होता है (का उपयोग करते हुए: सिर (GNU coreutils) 7.4) ... लेकिन जब पीछे\n
मौजूद है,-n -0
प्रिंट करता है जैसा कि उम्मीद की जा सकती है-
, अर्थात। यह पूरी फ़ाइल को प्रिंट करता है ... इसलिए यह सभी गैर-शून्य नकारात्मक मानों के लिए काम करता है .. लेकिन-0
जब कोई अनुगामी नहीं होता है\n