ฉันจะลบ n บรรทัดแรกของไฟล์ ascii โดยใช้คำสั่ง shell ได้อย่างไร


92

ฉันมีไฟล์หลายไฟล์ที่มีข้อมูลข้อความ ascii ใน 5-10 บรรทัดแรกตามด้วยข้อมูลเมทริกซ์ที่จัดเรียงอย่างดี ในเชลล์สคริปต์ฉันต้องการลบข้อความสองสามบรรทัดแรกเพื่อที่ฉันจะสามารถใช้ข้อมูลเมทริกซ์บริสุทธิ์ในโปรแกรมอื่น ฉันจะใช้คำสั่ง bash shell เพื่อทำสิ่งนี้ได้อย่างไร

หากเป็นความช่วยเหลือใด ๆ ฉันใช้ RedHat และระบบ Ubuntu linux

คำตอบ:


143

ตราบใดที่ไฟล์ไม่ใช่ symlink หรือ hardlink คุณสามารถใช้ sed, tail หรือ awk ตัวอย่างด้านล่าง

$ cat t.txt
12
34
56
78
90

sed

$ sed -e '1,3d' < t.txt
78
90

นอกจากนี้คุณยังสามารถใช้ sed ในสถานที่โดยไม่ต้องไฟล์ sed -i -e 1,3d yourfiletemp: สิ่งนี้จะไม่สะท้อนเสียงใด ๆ แต่จะแก้ไขไฟล์แบบแทนที่ หากคุณไม่ต้องการไพพ์ผลลัพธ์ไปยังคำสั่งอื่นนี่จะง่ายกว่า

หาง

$ tail -n +4 t.txt
78
90

awk

$ awk 'NR > 3 { print }' < t.txt
78
90

8
นอกจากนี้คุณยังสามารถใช้ sed ในสถานที่โดยไม่ต้องไฟล์ sed -i -e 1,3d yourfiletemp: สิ่งนี้จะไม่สะท้อนเสียงใด ๆ แต่จะแก้ไขไฟล์แบบแทนที่ หากคุณไม่ต้องการไพพ์ผลลัพธ์ไปยังคำสั่งอื่นนี่จะง่ายกว่า
Yanick Girouard

1
ขอบคุณ @YanickGirouard @IgnacioVazquezAbrams! คุณสองคนเพิ่งช่วยงานฝีมือของฉันให้ฉันในการวิจัยของฉัน! :)
เปาโล

2
@Svetlana sed -iโดยเฉพาะ การใช้งานส่วนใหญ่เพียงแค่ลบไฟล์และแทนที่ด้วยไฟล์ใหม่ซึ่งไม่สามารถใช้งานได้กับลิงก์เนื่องจากคุณจะทิ้งไฟล์ต้นฉบับไว้ที่ตำแหน่งอื่น
jw013

6
อธิบายเกี่ยวกับสิ่งที่ '1,3d', +4, et.c. หมายถึงอะไร? คำถามคือสำหรับ n บรรทัด แต่คุณไม่ได้บอกว่า n คืออะไร (เห็นได้ชัดว่า n คือ 2 ในตัวอย่างของคุณถึงแม้ว่ามันจะไม่ชัดเจนว่า noob จะเปลี่ยนอะไรเพื่อเปลี่ยน n)
Robin Manoli

3
นี้ใช้ไฟล์ temp ดังนั้นจึงไม่มีประโยชน์มากสำหรับพื้นที่ดิสก์ที่ใช้ 100% จะน่าสนใจที่จะมีทางออกที่ทำสิ่งนี้ "ในสถานที่" อย่างแท้จริง
ชัย


6

หากบรรทัดที่เป็นตารางเป็นบรรทัดที่มีอักขระแท็บ:

grep '␉' <input_file >output_file

( เป็นอักขระแท็บตัวอักษร) หรือเทียบเท่า

sed -n '/␉/p' <input_file >output_file

ในสคริปต์ทุบตี / ksh / zsh คุณสามารถเขียน$'\t'สำหรับแท็บเช่นหรือgrep $'\t'sed -n $'/\t/p'

หากคุณต้องการกำจัด 10 บรรทัดที่จุดเริ่มต้นของไฟล์:

tail -n +11 <input_file >output_file

(โปรดทราบว่ามัน+11จะกำจัด 10 บรรทัดเพราะ+11หมายถึง "เริ่มต้นจากบรรทัดที่ 11" และหมายเลขท้ายจาก 1) หรือ

sed '1,10d' <input_file >output_file

บน Linux คุณสามารถใช้ประโยชน์จาก-iตัวเลือกของ GNU sed เพื่อแก้ไขไฟล์ได้:

sed -i -n '/\t/p' *.txt

หรือคุณสามารถใช้เชลล์ลูปและไฟล์ชั่วคราว:

for x in *.txt; do
  tail -n +11 <"$x" >"$x.tmp"
  mv "$x.tmp" "$x"
done

หรือถ้าคุณไม่ต้องการแก้ไขไฟล์ให้เข้าที่ แต่ให้ตั้งชื่ออื่นแทน:

for x in *.txt; do
  tail -n +11 <"$x" >"${x%.txt}.data"
done

3
"tabulated" มักจะหมายถึง "พิมพ์สวยในตาราง" ไม่ใช่ "เยื้องด้วยอักขระแท็บ"
Ignacio Vazquez-Abrams

@ IgnacioVazquez-Abrams ฉันรู้ บางครั้งตารางที่พิมพ์ออกมาสวยจะใช้อักขระของแท็บทำให้มองเห็นได้ง่ายกว่าคอลัมน์ที่จัดแนว แน่นอนถ้าพอลให้การป้อนตัวอย่างฉันจะให้ matcher ที่ดีกว่า
Gilles


0

echo "a \ nb" | sed '1d' # ลบบรรทัดแรก

cat list.txt | sed '1d'> list.csv # read list.txt และเขียน list.csv โดยไม่มีบรรทัดแรก

คำสั่งที่มีประโยชน์อื่น ๆ :

grep '^ |' # ค้นหาอักขระแรก (ไปป์ |)

sed 's / | // g' # ลบไพพ์

sed 's / // g' # ลบพื้นที่


0

ตามเปอร์เซ็นต์

การใช้bash, เพื่อล้างไฟล์โดยใช้ตัวเลขร้อยละแทนจำนวนบรรทัดสมบูรณ์:

sed -i -e 1,$( printf  "$((`cat php_errors.log | wc -l` * 75 /100 ))" )d php_errors.log

ระวังเพราะคำสั่งนั้นสามารถทำลายได้เนื่องจากจะลบเนื้อหาในสถานที่โดยไม่ต้องสร้างสำเนา

มันจะลบ 75% แรกของบรรทัดจากไฟล์ที่กล่าวถึง

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