फ़ाइल से अंतिम पंक्ति हटाएं


44

मैं sed विशिष्ट स्थिति के साथ लाइनों को जल्दी से हटाने के लिए उपयोग करता हूं

sed '1d'
sed '5d'

लेकिन, क्या होगा अगर मैं फ़ाइल की अंतिम पंक्ति को हटाना चाहता हूं और मुझे लाइनों की गिनती नहीं पता है (मुझे पता है कि मैं उस का उपयोग कर wcऔर कई अन्य चालें प्राप्त कर सकता हूं )।

वर्तमान में, ऐसा करने के लिए headऔर इसके tailसाथ संयुक्त वर्कअराउंड का उपयोग wcकरना। किसी भी त्वरित यहाँ ट्विस्ट?


कौन सा ओएस? कुछ स्वादों के लिए दिलचस्प विकल्प हैं headऔर tail...
निल्स

@ नील मैं 'Red Hat Enterprise Linux सर्वर रिलीज़ 5.5 (टिकंगा)' पर हूँ। क्या आप विभिन्न स्वादों के लिए विकल्पों की ओर इशारा कर सकते हैं headऔर tailआप जानते हैं?
एमटीके

मैंने किया। निचे देखो।
Nils

जवाबों:


87

$अंतिम पंक्ति को हटाने के लिए sed अंतिम पंक्ति है:

sed '$d' <file>

12
sed -i '$d' <file>जगह में फ़ाइल को संपादित करने के लिए उपयोग करें।
WanderingMind

1
अंतिम एन लाइनों को हटाने के लिए क्या होगा, जहां एन कोई पूर्णांक संख्या है?
जोशुआ सालजार

31

$ अंतिम पंक्ति के लिए:

sed '$d' file

9
आपको 30 सेकंड से हराया: P
h3rrmiller

1
अफसोस की बात है कि अंतिम दो लाइनों को हटाने के लिए किसी को अधिक जटिल तकनीकों का उपयोग करना पड़ता है।
डबियसजिम

क्या मतलब? sed '$d' file; sed '$d' file
रोब

3
@ रोब: sed '$d' fileवास्तव में फ़ाइल को संशोधित नहीं करता है; यह केवल फ़ाइल की सामग्री को प्रिंट करता है, अंतिम पंक्ति को घटाता है। तो sed '$d' file; sed '$d' fileहर बार फाइल की सामग्री को दो बार प्रिंट करेंगे , हर बार अंतिम पंक्ति को घटाएंगे। समतुल्य-अंतिम-दो-पंक्तियाँ के बराबर sed '$d' fileहै sed '$d' file | sed '$d'
बरबाद

2
हाँ, यह अयोग्य है लेकिन निश्चित रूप से यह काम करता है। मैं इसे एक पास में करूंगा sed -n '1{h;n;}; $q; x; p;'। मैं कह रहा था कि हम बस नहीं कर सकते sed '$-1,$d'
डबियसजिम

14

cat file.txt | head -n -1 > new_file.txt

खबरदार, ऐसा लगता है, file.txtअगर यह अंतिम पंक्ति पर निर्भर करता है (यदि इसके साथ समाप्त होता है EOF, या \nफिर EOF), तो इस कमांड के बाद लाइनों की संख्या new_file.txtसमान हो सकती है (जैसे file.txt) यह तब होता है (जब ऐसा नहीं होता है \n) - किसी भी मामले में, अंतिम पंक्ति की सामग्री हटा दी गई है।

इसके अलावा, ध्यान दें कि आपको दूसरी (मध्यवर्ती) फ़ाइल का उपयोग करना होगा। यदि आप बिल्ली और उसी फ़ाइल पर रीडायरेक्ट करते हैं, तो आप इसे मिटा देंगे।


6
जहां यह काम करता है, यह बस भी हो सकता है head -n -1 file.txt > new_file.txt। ध्यान दें कि नकारात्मक गणना head -nकेवल कुछ कार्यान्वयन के लिए उपलब्ध है head। उदाहरण के लिए, यह FreeBSD के लिए या के बिजीबॉक्स संस्करण के लिए काम नहीं करता है head
डबियसजिम

1
@dubiousjim: सहमत, head -n -1 file.txt > new_file.txtबेहतर है। यह मेरी दो टिप्पणियों (समान संख्या, और एक ही फ़ाइल पर मिटा) के संबंध में उसी तरह काम करता है। नकारात्मक तर्क के लिए, यूनिक्स के बीच समय-समय पर इस तरह के मतभेद होते हैं, और वे अक्सर निराश होते हैं क्योंकि आप इसे पूरी तरह से एक ही कमांड होने की उम्मीद करते हैं (और आप - एक ही नाम और उद्देश्य क्यों नहीं!) - किसी भी तरह, अच्छा बिंदु। (मैं डेबियन का उपयोग करता हूं।)
इमानुएल बर्ग

5

head --lines=-1। मैं पहली बार SLES11SP2- सिस्टम (हेडुट-8.12-6.23.1) पर सिर के लिए मैन-पेज में इस संभावना को पार कर गया।

tailऔर headका हिस्सा हैं coreutils(आरपीएम आधारित प्रणालियों के लिए कम से कम) -rpm।

कोरुटिल्स के चैंज के अनुसार, यह वाक्य रचना कोरुटिल्स-संस्करण 5.0.1 के बाद से समर्थित है

बुरी खबर: आरएच 5-मैन-पेज के अनुसार इस विकल्प का वर्णन नहीं किया गया है

अच्छी खबर: यह आरएच 5 के साथ काम करता है (इसलिए आपके मामले में: यह काम करता है - कम से कम आरएच 5 के वर्तमान संस्करण के साथ)।

rpm -q coreutils मुझे दिखाता है (CentOS 5.8 पर): coreutils-5.97-34.el5_8.1

मुझे यकीन नहीं है कि अगर आरएच 5.5। पहले से ही कोरुटिल्स-संस्करण है जो इसका समर्थन करता है। लेकिन 5.5 वैसे भी EoLed है।


+1। यह पूरी तरह से RH5.5 पर काम करता है। धन्यवाद।
एमटी

0

लिनक्स

$ अंतिम पंक्ति है, डी को हटाने के लिए:

sed '$d' ~/path/to/your/file/name

मैक ओ एस

तलछट के समतुल्य -इ

sed -i '' -e '$ d' ~/path/to/your/file/name
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.