कैसे एक स्क्रिप्ट में एक फ़ाइल की पहली पंक्ति पाने के लिए?


249

मुझे एक बैश वैरिएबल में किसी फाइल की पहली लाइन डालनी है। मुझे लगता है कि यह grep कमांड के साथ है, लेकिन यह लाइनों की संख्या को प्रतिबंधित करने का कोई तरीका है?

जवाबों:


397

headकिसी फ़ाइल से पहली लाइनें लेता है, और -nपैरामीटर का उपयोग यह निर्दिष्ट करने के लिए किया जा सकता है कि कितनी लाइनें निकाली जानी चाहिए:

line=$(head -n 1 filename)

3
readदृष्टिकोण की तुलना में बहुत अधिक उपरि । $()एक उपखंड बंद कर देता है, और एक बाहरी कमांड ( किसी भी बाहरी कमांड) का उपयोग करने का मतलब है कि आप कॉल कर रहे हैं execve(), लिंकर और लोडर को आमंत्रित कर रहे हैं (यदि यह साझा पुस्तकालयों का उपयोग कर रहा है, जो आमतौर पर मामला है), आदि
चार्ल्स डफी

2
यह और भी छोटा हो सकता है:line="$(head -1 FILENAME)"
nikolay

3
और यह भी:line=`head -1 FILENAME`
Shai Alon

के head...रूप में $()करता है के रूप में एक उपखंड के चारों ओर backticks करता है ?.
Jaime Hablutzel

@JaimeHablutzel हां, वे एक ही बात हैं, हालांकि मुझे व्यक्तिगत रूप से लगता है कि $()वाक्य रचना देखने में आसान है, और निरपेक्षता पर स्पष्टता है। gnu.org/software/bash/manual/html_node/…
जोसेफ़ सिकोरस्की

61

बैश का उपयोग करके पहली पंक्ति पढ़ने के लिए, readकथन का उपयोग करें । जैसे

read -r firstline<file

firstline आपका चर होगा (दूसरे को असाइन करने की आवश्यकता नहीं है)


1
@ सोरिन, cat ... | read VARअधिकांश गोले में विफल हो जाएगा ( zshजहां तक ​​मुझे पता है) को छोड़कर सभी क्योंकि एक पाइप में प्रत्येक घटक अलग-अलग उपधाराओं में चलेगा। अर्थ यह है कि $VARइनवॉइस शेल के बजाय सब-सेट में सेट किया जाएगा (जैसे ही पाइप लाइन समाप्त होते ही मौजूद हो जाएगा)। आप इसके साथ read VAR <<EOF\n$(cat ...)\nEOF(जहां प्रत्येक \nएक नई पंक्ति है) इसके चारों ओर प्राप्त कर सकते हैं ।
11:28 बजे zrajm

@ सोरिन, catशुद्ध उपरि है; किसी भी तरह read -r var <fileसे अधिक कुशल cat file | read, भले ही बादशाह BashFAQ # 24 में वर्णित कारणों के लिए विफल नहीं हुआ ।
चार्ल्स डफी

... अगर आप कुछ ज्यादा शामिल कर रहे हैं cat, तोread -r var < <(otherprog ...)
चार्ल्स डफी

14

यह filenameपरिवर्तनशील है और चर की पहली पंक्ति को संग्रहीत करता है $line:

read -r line < filename

मुझे यह भी पसंद awkहै:

awk 'NR==1 {print; exit}' file

लाइन को स्टोर करने के लिए, var=$(command)सिंटैक्स का उपयोग करें । इस मामले में, line=$(awk 'NR==1 {print; exit}' file)

या यहां तक ​​कि sed:

sed -n '1p' file

समकक्ष के साथ line=$(sed -n '1p' file)


एक नमूना देखें जब हम readसाथ भोजन करते हैं seq 10, अर्थात 1 से 10 तक संख्याओं का क्रम:

$ read -r line < <(seq 10) 
$ echo "$line"
1

$ line=$(awk 'NR==1 {print; exit}' <(seq 10))
$ echo "$line"
1

1
sed '1!d;q'(या sed -n '1p;q') आपके awkतर्क की नकल करेगा और फ़ाइल में आगे पढ़ने से रोकेगा। क्योंकि हम केवल पहली पंक्ति चाहते हैं, हम वैकल्पिक रूप से sed qया ( awk '1;{exit}'या grep -m1 ^कम कोड, समान आवश्यक तर्क) के साथ धोखा कर सकते हैं । (यह डाउनवोट पूछताछ का जवाब नहीं है।)
एडम काट्ज

@AdamKatz यह बहुत अच्छा तरीका है, धन्यवाद! मैं grepबहुत स्मार्ट के साथ एक पाते हैं । हम भी निश्चित रूप से कह सकते हैं head -n 1 file
फेडोरक्वी 'एसओ ने'

हां, head -n1तेज होगा (लोड करने के लिए छोटा बाइनरी) और readसबसे तेज होगा (लोड करने के लिए कोई बाइनरी नहीं, यह एक बिलिन है)। मुझे विशेष रूप से पसंद है grep -m1 --color .जब मैं सिर्फ पहली पंक्ति को प्रिंट कर रहा हूं क्योंकि यह लाइन को भी रंग देगा, जिससे यह तालिका शीर्षकों के लिए बहुत अच्छा होगा।
एडम काटज

12
line=$(head -1 file)

ठीक काम करेंगे। (पिछले जवाब के रूप में)। परंतु

line=$(read -r FIRSTLINE < filename)

readबिल्ट-इन बैश कमांड के रूप में थोड़ी तेजी से होगा ।


21
दूसरी विधि लिखित के रूप में काम नहीं करती है, क्योंकि readकुछ भी प्रिंट नहीं करता है (इसलिए lineखाली हवाएं), और एक सबशेल में भी निष्पादित होता है (इसलिए FIRSTLINEयह पहली पंक्ति में सेट हो जाता है, लेकिन केवल उपधारा में, इसलिए यह बाद में उपलब्ध नहीं है)। समाधान: सिर्फ उपयोग करेंread -r line <filename
गॉर्डन डेविसन

5

बस echoअपने स्रोत फ़ाइल की पहली सूची अपने लक्ष्य फ़ाइल में।

echo $(head -n 1 source.txt) > target.txt

3
जिसके head -n 1 source.txt > target.txtलिए बिल्कुल वही पूरा होगा।
योयो

4

सवाल यह नहीं पूछा गया कि कौन सा सबसे तेज़ है, लेकिन sed जवाब में जोड़ने के लिए, -n '1p' बुरी तरह से प्रदर्शन कर रहा है क्योंकि पैटर्न स्पेस अभी भी बड़ी फ़ाइलों पर स्कैन किया गया है। जिज्ञासा से मैंने पाया कि 'सिर' सेड पर अधिक जीतता है:

# best:
head -n1 $bigfile >/dev/null

# a bit slower than head (I saw about 10% difference):
sed '1q' $bigfile >/dev/null

# VERY slow:
sed -n '1p' $bigfile >/dev/null
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.