คำถามติดแท็ก awk

รูปแบบการสแกนและการประมวลผลภาษา

1
สภาพ awk ของจริงและเท็จ
ฉันเจอว่าถ้าเราใช้awk 0 inputfileมันจะไม่พิมพ์สาเหตุใด ๆ0หมายความว่าผิดเงื่อนไข หากเราใช้awk 1 inputfileมันจะพิมพ์ทุกอย่างตามที่เป็น1จริงสำหรับแต่ละบรรทัด awk ตีความ ถ้าเราใช้awk any_string inputfileมันจะไม่พิมพ์อะไรเลยเพราะตัวแปร awk ทั้งหมดที่เริ่มต้นเป็นศูนย์จึงเป็นเท็จ แต่ถ้าเราใช้awk any_integer inputfileมันจะกลายเป็นจริงและพิมพ์แต่ละบรรทัดของไฟล์ฉันจะรู้ได้อย่างไรว่าอะไรคือสาเหตุ? ฉันไม่สามารถหานี้ได้รับการอธิบายในGNU awkคู่มือแม้ว่า
9 awk  gawk 

4
คำถามเกี่ยวกับ awk
ตกลงเนื่องจากเป็นคำถามที่ซับซ้อนฉันจะอธิบายอย่างชัดเจน ฉันได้ไฟล์เนื้อหาที่แสดงด้านล่าง: $ Cat File1 ABC Cool Lol POP {MNB} ABC Cool Lol POP {MNB} ABC Cool Lol POP {MNB} ABC Cool Lol POP {TBMKF} ABC Cool Lol POP {YUKER} ABC Cool Lol POP {EFEFVD} ผลลัพธ์ที่ฉันต้องการ -Cool MNB + POP ; -Cool MNB + POP ; -Cool MNB + POP …

7
grep บล็อกเส้นที่แน่นอน (เนื้อหาของ file1) จาก file2
ฉันมีสองไฟล์file1และfile2. เนื้อหาตัวอย่างของfile1คือ: A B C D E F G H และเนื้อหาของfile2เป็นเช่น: A B few other lines E F few more other lines A B C D E F G H few more other lines G H ดังนั้นฉันต้องการค้นหาบล็อกทั้งหมดของfile1เนื้อหาในfile2เท่านั้น ซึ่งหมายความว่าผลลัพธ์ควรมีเพียงบรรทัดเหล่านี้: A B C D E F G H โปรดทราบว่า: - เฉพาะบรรทัดที่มารวมกันควรเป็นส่วนหนึ่งของผลลัพธ์

5
วิธีย่อ / path / to / file ไปยัง / p / t / file
ฉันกำลังมองหาซับในที่สง่างาม (เช่นawk) ที่จะทำให้สตริงของเส้นทาง Unix สั้นลงโดยใช้อักขระตัวแรกของผู้ปกครองแต่ละคน / ระดับกลาง แต่เป็นชื่อเต็ม ง่ายต่อการแสดงโดยตัวอย่าง: /path/to/file → /p/t/file /tmp → /tmp /foo/bar/.config/wizard_magic → /f/b/./wizard_magic /foo/bar/.config/wizard_magic→ /f/b/.c/wizard_magic จากจุดที่ดีโดย @ MichaelKjörlingและ @ChrisH ด้านล่างตัวอย่างนี้แสดงให้เห็นว่าเราจะแสดงตัวละครสองตัวแรกอย่างไรเมื่อตัวอักษรตัวแรกเป็นจุด
9 sed  awk  string 


7
วิธีการแยกไฟล์ข้อความขนาดใหญ่อย่างมีประสิทธิภาพโดยไม่ต้องแยกหลายระเบียน
ฉันมีไฟล์ข้อความขนาดใหญ่ (~ 50Gb เมื่อ gz'ed) ไฟล์มี4*Nเส้นหรือNบันทึก นั่นคือทุกระเบียนประกอบด้วย 4 บรรทัด ฉันต้องการแบ่งไฟล์นี้เป็นไฟล์ขนาดเล็กลง 4 ไฟล์แต่ละไฟล์มีขนาดประมาณ 25% ของไฟล์อินพุต ฉันจะแบ่งไฟล์ที่ขอบเขตการบันทึกได้อย่างไร? วิธีการที่ไร้เดียงสาจะเป็นzcat file | wc -lที่จะได้รับการนับเส้นแบ่งว่าจำนวน 4 split -l <number> fileและการใช้งานแล้ว อย่างไรก็ตามสิ่งนี้จะข้ามไฟล์สองครั้งและการนับบรรทัดช้ามาก (36 นาที) มีวิธีที่ดีกว่า? นี่เข้ามาใกล้ แต่ไม่ใช่สิ่งที่ฉันกำลังมองหา คำตอบที่ยอมรับจะนับจำนวนบรรทัดด้วย แก้ไข: ไฟล์มีข้อมูลลำดับในรูปแบบ fastq สองระเบียนมีลักษณะเช่นนี้ (ไม่ระบุชื่อ): @NxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxGCGA+ATAGAGAG xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxTTTATGTTTTTAATTAATTCTGTTTCCTCAGATTGATGATGAAGTTxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + AAAAA#FFFFFFFFFFFFAFFFFF#FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF<AFFFFFFFFFFAFFFFFFFFFFFFFFFFFFF<FFFFFFFFFAFFFAFFAFFAFFFFFFFFAFFFFFFAAFFF<FAFAFFFFA @NxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxGCGA+ATAGAGAG xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxCCCTCTGCTGGAACTGACACGCAGACATTCAGCGGCTCCGCCGCCxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + AAAAA#FFFFF7FFFFFFAFFFFA#F7FFFFFFFFF7FFFFFAF<FFFFFFFFFFFFFFAFFF.F.FFFFF.FAFFF.FFFFFFFFFFFFFF.)F.FFA))FFF7)F7F<.FFFF.FFF7FF<.FFA<7FA.<.7FF.FFFAFF @บรรทัดแรกของแต่ละระเบียนจะเริ่มต้นด้วย EDIT2: zcat file > …

9
เราสามารถพิมพ์คำสุดท้ายของแต่ละบรรทัดใน linux โดยใช้คำสั่ง sed ได้หรือไม่?
สมมติว่าหากมีไฟล์ประกอบด้วยบรรทัดต่อไปนี้ถ้าเป็น 12345 567 7878 66 er3 t45t y6y46y 4y6 y656y y5y 46y6 65 ปี 7 y66uyuy yy46y6y ผลลัพธ์ต้องมีลักษณะดังนี้: 66 y6y46y y5y y66uyuyy y46y6y ฉันได้ลองใช้sed 's/.* //g'ชื่อไฟล์คำสั่งและsedคำสั่งอื่น ๆแล้ว แต่มันไม่ทำงาน ฉันจะรู้ได้อย่างไรว่าsedคำสั่งที่แน่นอนคืออะไร?

8
จะผนวก Line เข้ากับ Line ก่อนหน้าได้อย่างไร?
ฉันมีไฟล์บันทึกซึ่งต้องวิเคราะห์และวิเคราะห์ ไฟล์มีบางสิ่งที่คล้ายกันดังนี้: ไฟล์: 20141101 server contain dump 20141101 server contain nothing {uekdmsam ikdas jwdjamc ksadkek} ssfjddkc * kdlsdl sddsfd jfkdfk 20141101 server contain dump จากสถานการณ์ข้างต้นฉันต้องตรวจสอบว่าบรรทัดเริ่มต้นไม่มีวันที่หรือหมายเลขที่ฉันต้องต่อท้ายบรรทัดก่อนหน้า ไฟล์ที่ส่งออก: 20141101 server contain dump 20141101 server contain nothing {uekdmsam ikdas jwdjamc ksadkek} ssfjddkc * kdlsdl sddsfd jfkdfk 20141101 server contain dump

4
การนับจำนวนครั้งที่แต่ละที่อยู่ IP ปรากฏในล็อกไฟล์
ฉันมีไฟล์ในรูปแบบดังต่อไปนี้: $ cat file.txt 27.33.65.2 27.33.65.2 58.161.137.7 121.50.198.5 184.173.187.1 184.173.187.1 184.173.187.1 เป็นวิธีที่ดีที่สุดในการแยกไฟล์file.txtเป็นรูปแบบดังนี้: 27.33.65.2: 2 58.161.137.7: 1 121.50.198.5: 1 184.173.187.1: 3 กล่าวอีกนัยหนึ่งฉันต้องการวนรอบไฟล์และนับจำนวนครั้งที่ที่อยู่ IP แต่ละรายการปรากฏขึ้น ฉันได้ลองใช้งานแล้วsortดังนั้นที่อยู่ IP ทั้งหมดจึงเป็นระเบียบและต่อเนื่องกัน
9 awk  sort 

3
วิธีการลบแถว (บรรทัด) ด้วย AWK
ฉันพยายามหาวิธีที่ฉันสามารถใช้AWKเพื่อลบบรรทัด ตัวอย่างเช่นสมมติว่าไฟล์อินพุตคือ: 30 20 ผลลัพธ์จะเป็น: 10 ตอนนี้เป็นการทดสอบฉันพยายามคำนวณคอลัมน์หน่วยความจำ "ใช้แล้ว" จาก: $ cat /proc/meminfo ดังนั้นในขณะนี้ฉันได้เขียนสิ่งนี้: $ grep -P 'MemTotal|MemFree' /proc/meminfo | \ -- Here comes the calculation using AWK ฉันได้ลองทำสิ่งต่อไปนี้แล้ว: $ grep -P 'MemTotal|MemFree' /proc/meminfo | \ awk '{print $2}' | awk '{$0-s}{s=$0} END {print s}' แต่นี่เป็นเพียงแถวสุดท้ายของข้อมูล ฉันพบวิธีแก้ไขปัญหาการทำงาน แต่ฉันสงสัยว่าเป็นวิธีที่ดีที่สุด ประสบการณ์การเขียนโค้ดทั้งหมดของฉันบอกฉันว่าการเข้ารหัสฮาร์ดจำนวนแถวนั้นแย่มาก: P $ …
9 linux  awk 

2
กำลังประมวลผลสองไฟล์โดยใช้ awk
ผมอ่านเปรียบเทียบสองไฟล์โดยใช้ Unix และ Awk มันน่าสนใจจริงๆ ฉันอ่านและทดสอบ แต่ไม่สามารถเข้าใจได้อย่างสมบูรณ์และใช้ในกรณีอื่น ฉันมีสองไฟล์ file1มีหนึ่งฟิลด์และอีกฟิลด์หนึ่งมี 16 ฟิลด์ ฉันต้องการที่จะอ่านองค์ประกอบของfile1 file2และเปรียบเทียบกับข้อมูลที่ หากมีการแข่งขันสำหรับแต่ละองค์ประกอบ, I คุ้มค่าผลรวมของสนามที่ 5 file2ใน ตัวอย่างเช่น: ไฟล์ 1 1 2 3 ไฟล์ 2 2 2 2 1 2 3 6 1 2 4 4 1 1 2 3 6 3 3 3 4 สำหรับองค์ประกอบ 1 ในfile1ฉันต้องการที่จะเพิ่มค่าในสาขาที่ 5 …

5
เปรียบเทียบสองไฟล์กับคอลัมน์แรกและลบแถวที่ซ้ำกันออกจากไฟล์ที่ 2 ในเชลล์สคริปต์
ฉันจะถามคำถามของฉันพร้อมตัวอย่าง ฉันมี 2 ไฟล์: ไฟล์ # 1: 118D FC300_R5_TP FX.B 32775 2112 6 2038 6 2112 0 118E FC300_R5_TP FX.B 32775 2136 7 2065 6 2136 0 118F FC300_R5_TP FX.B 32775 2124 6 2064 6 2124 0 1190 FC300_R5_TP FX.B 819210 814632 99 814609 99 814632 0 1191 FC300_R5_TP FX.B …

5
การรวมสองไฟล์ด้วยตัวระบุเฉพาะ
ฉันมีสองไฟล์ที่มีรายการประมาณ 12900 และ 4400 ตามลำดับที่ฉันต้องการเข้าร่วม ไฟล์ดังกล่าวมีข้อมูลตำแหน่งสำหรับสถานีสำรวจสภาพอากาศที่มีที่ดินเป็นฐานทั่วโลก ไฟล์ที่ใหญ่ที่สุดจะได้รับการอัพเดตทุกสองสัปดาห์และมีขนาดเล็กลงปีละครั้งหรือมากกว่านั้น สามารถดูไฟล์ต้นฉบับได้ที่นี่ ( http://www.wmo.int/pages/prog/www/ois/volume-a/vola-home.htmและ http://weather.rap.ucar.edu/surface/ สถานี . txt ) ไฟล์ที่ฉันมีอยู่แล้วถูกจัดการโดยฉันด้วย awk, sed, และ bash script บางตัว ฉันใช้ไฟล์เพื่อให้เห็นภาพข้อมูลโดยใช้แพ็คเกจ GEMPAK ซึ่งสามารถใช้งานได้อย่างอิสระจาก Unidata ไฟล์ที่ใหญ่ที่สุดจะทำงานกับ GEMPAK แต่จะไม่สามารถทำงานได้อย่างเต็มประสิทธิภาพ สำหรับการเข้าร่วมนี้เป็นสิ่งจำเป็น ไฟล์ 1 มีข้อมูลตำแหน่งสำหรับสถานีตรวจสอบสภาพอากาศโดยที่ตัวเลข 6 ตัวแรกคือตัวระบุสถานีที่ไม่ซ้ำกัน พารามิเตอร์ที่แตกต่างกัน (หมายเลขสถานีชื่อสถานีรหัสประเทศละติจูดลองจิจูดและระดับความสูงของสถานี) จะถูกกำหนดโดยตำแหน่งในบรรทัดเท่านั้นนั่นคือไม่มีแท็บ 060090 AKRABERG FYR DN 6138 -666 101 060100 VAGA FLOGHAVN DN 6205 …

2
Gawk: ผ่านอาร์เรย์ไปยังฟังก์ชั่น
ติดอยู่กับ GNU awk 3.1.6 และคิดว่าฉันได้แก้ไขข้อบกพร่องของอาเรย์แล้ว แต่ยังมีสิ่งที่ดูเหมือนปัญหาขอบเขตในโปรแกรม 600 บรรทัด awk จำเป็นต้องตรวจสอบความเข้าใจของขอบเขตอาร์เรย์ใน awk เพื่อค้นหาข้อผิดพลาดของฉัน รับรหัส awk นี้เป็นตัวอย่าง ... function foo(ga) { ga[1] = "global result" } garray[1] = "global" foo(garray) print garray[1] จะพิมพ์ ... global result เนื่องจากอาร์เรย์จะถูกส่งผ่านไปยังฟังก์ชันโดยอ้างอิงเสมอดังนั้นอาร์เรย์ทั้งหมดจึงเป็นแบบโกลบอลเสมอ ไม่มีวิธีสร้างอาร์เรย์โลคัล ถูกต้องหรือไม่ ไม่พบเอกสารที่พูดอย่างชัดเจนว่า เนื่องจากฉันทำการดีบั๊กและตัว 3.1.6 รู้จักข้อบกพร่องในพื้นที่นี้ฉันกำลังพยายามหาจุดบกพร่องของ awk และจุดเริ่มต้นของฉัน เพิ่มเติม: เพราะเหตุใด ga [] จึงทำงานภายในฟังก์ชันได้ ก่อนอื่นเลยการส่งอาร์เรย์ไปยังฟังก์ชันด้วยfoo(ga)นั้นไม่จำเป็นจริง ๆ …
9 awk  function  array 

1
แทนที่หลายบรรทัดใน sed หรือ awk [ปิด]
ปิด คำถามนี้ต้องการรายละเอียดหรือความคมชัด ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ เพิ่มรายละเอียดและชี้แจงปัญหาโดยแก้ไขโพสต์นี้ ปิดให้บริการใน5 ปีที่ผ่านมา ฉันกำลังพยายามใช้ sed หรือ awk เพื่อแทนที่ 5 บรรทัดในไฟล์ smb แต่ฉันไม่มีความคิดวิธีจัดการกับการขึ้นบรรทัดใหม่
9 sed  awk  scripting  perl 

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