วิธีเลือกบรรทัดแรกจากแต่ละไฟล์ในไดเรกทอรีและพิมพ์ลงในไฟล์ข้อความใหม่


13

ฉันมีไดเรกทอรีที่มีหลาย.txtไฟล์

จากไฟล์เหล่านี้แต่ละไฟล์ฉันต้องการเลือกบรรทัดแรกและพิมพ์ลงใน.txtไฟล์ใหม่(เพื่อรับรายการบรรทัดแรกทั้งหมด)

ฉันลองกับawkและsedคำสั่งและรวมกับวง แต่ไม่ประสบความสำเร็จ


1
ในฐานะที่คุณเป็นผู้ใช้ชื่อเสียงที่ 6: ถ้าใด ๆ ของ anwsers ด้านล่างช่วยให้คุณไม่ลืมที่จะคลิกสีเทาที่ด้านซ้ายของข้อความซึ่งหมายความว่าใช่คำตอบนี้ถูกต้อง ! ;-)
Fabby

คำตอบ:


21

การใช้head:

head -n1 -q *.txt > new-file
  • -n1บอกheadให้แยกบรรทัดแรกเท่านั้น
  • -q บอกหัวไม่ให้พิมพ์ชื่อไฟล์

9

การใช้grep:

grep -m 1 '.' *.txt >output.file

grepจะตรงกับตัวอักษรใด ๆ และจะออกหลังจากที่นัดแรกคือจะออกเส้นแรกของทั้งหมดใส่ไฟล์และเราจะประหยัดในบรรดาgrepout.txt


1
ฉันชอบสิ่งนี้มันเป็นแฮ็คที่ดี
Hashim

2

ใช้ Bash เท่านั้น:

for f in *.txt; do <"$f" read line; printf "$line\n" >>new.txt; done
  • *.txtถูกขยายไปยังรายการโฟลเดอร์ / ไฟล์ที่ลงท้ายด้วย.txtในไดเรกทอรีการทำงานปัจจุบัน (เนื่องจากมีเฉพาะโฟลเดอร์ไฟล์ที่ลงท้ายด้วย.txtไม่ใช่ข้อกังวล);
  • <"$f" read lineอ่านหนึ่งบรรทัดจากเส้นทางไฟล์ที่เก็บไว้ในfและเก็บไว้ในline;
  • printf "$line\n" >>new.txt: ผนวกเนื้อหาของlineการnew.txt;
% cat foo.txt 
line #1 in foo
line #2 in foo
line #3 in foo

% cat bar.txt
line #1 in bar
line #2 in bar
line #3 in bar

% for f in *.txt; do <"$f" read line; printf "$line\n" >>new.txt; done

% cat new.txt 
line #1 in bar
line #1 in foo

คอสบิตยาว แต่นี่คือ 1 ..
heemayl

@ heemayl แต่มันก็แค่ Bash เท่านั้น ;)
kos

1
BTW ขอแสดงความยินดีกับ 15k :)
heemayl

1
@ heemayl ขอบคุณ: D สุจริตฉันตรวจสอบจากเว็บไซต์อย่างบ้าคลั่งเพียงเพื่อประโยชน์ของการปกป้อง XD คำถาม
คอส


0

อีกวิธีในการใช้ AWK คือการบอกให้ AWK ทำการพิมพ์ แต่จากนั้นไปที่ไฟล์ถัดไปทันที

tmp:$ touch file1 file2 file3

tmp:$ printf  "Line 1 \n Line 2" | tee file1 file2 file3
Line 1 
 Line 2
tmp:$ awk '{print;nextfile}' file1 file2 file3
Line 1 
Line 1 
Line 1

sedยังช่วยให้การพิมพ์ของบรรทัดที่เฉพาะเจาะจง ที่นี่ฉันรวมกับfind

tmp:$ find . -name "file*" -exec  sed -n '1p' {} \;                            
Line 1 
Line 1 
Line 1 

และ Perl:

tmp:$ find . -name "file*"  -exec perl -ne 'print  if 1..1' {} \;              
Line 1 
Line 1 
Line 1 

และสุดท้าย แต่ไม่ท้ายสุด grep

tmp:$ grep -n 1 file1 file2 file3                                              
file1:1:Line 1 
file2:1:Line 1 
file3:1:Line 1 

การบันทึกทุกอย่างลงในไฟล์เดียวเป็นเพียงการต่อ> outputFile.txtท้ายคำสั่งเหล่านี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.