ข้าม 6 บรรทัด / แถวแรกในไฟล์ข้อความด้วย awk


39

ฉันจะข้าม 6 บรรทัด / แถวแรกในไฟล์ข้อความ (input.txt) และประมวลผลส่วนที่เหลือด้วย awk ได้อย่างไร รูปแบบของสคริปต์ awk ของฉัน (program.awk) คือ:

BEGIN {
} 

{ 
process here
} 

END {

}

ไฟล์ข้อความของฉันเป็นดังนี้:

0
3
5
0.1 4.3
2.0 1.5
1.5 3.0
0.3 3.3
1.5 2.1
.
.
.

ฉันต้องการประมวลผลไฟล์เริ่มต้นจาก:

0.3 3.3
1.5 2.1
.
.
.

คำตอบ:


59

ใช้หนึ่งในสองรูปแบบ:

NR>6 { this_code_is_active }

หรือสิ่งนี้:

NR<=6 { next }
{ this_code_is_active }

ใช้ FNR แทน NR หากคุณมีไฟล์จำนวนมากเป็นอาร์กิวเมนต์เพื่อ awk และต้องการข้าม 6 บรรทัดในทุกไฟล์


29

ลอง:

awk 'FNR > 6 { #process here }' file

4
ดี! แต่คุณไม่ได้อธิบายว่าทำไมจึงดีกว่านี้ - สำหรับไฟล์หลายไฟล์FNRคือหมายเลขแถวในแต่ละไฟล์ในขณะNRที่หมายเลขในอินพุตทั้งหมด (ไม่ใช่ปัญหาเมื่อมีการไพพ์)
Tomasz Gandor

3

นอกจากนี้คุณยังสามารถข้ามจำนวนบรรทัดโดยพลการที่จุดเริ่มต้นหรือจุดสิ้นสุดของไฟล์โดยใช้headหรือtailโปรแกรม

สำหรับคำถามที่เป็นรูปธรรมของคุณ

tail input.txt -n+7 | program.awk

จะทำหากprogram.awkไฟล์ของคุณสามารถใช้งานได้ มิฉะนั้นคุณอาจใช้

tail input.txt -n+7 | awk -f program.awk

ด้วยวิธีนี้คุณจะสำรองการเปรียบเทียบสำหรับแต่ละบรรทัดและคุณไม่จำเป็นต้องเปลี่ยนตรรกะของรหัส AWK ของคุณ

tail จะเริ่มสตรีมข้อความที่เริ่มต้นที่บรรทัดที่เจ็ดโดยข้ามหกบรรทัดแรก

นี่จะไม่ใช่เรื่องใหญ่ในเรื่องประสิทธิภาพโดยเฉพาะอย่างยิ่งหากกระบวนการข้อความนั้นง่ายมากด้วยการแคช อย่างไรก็ตามสำหรับไฟล์ที่มีความยาวและการใช้ซ้ำในสภาพแวดล้อมคลาวด์อาจประหยัดค่าใช้จ่าย


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