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

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

3
อะไรคือความแตกต่างที่แน่นอนระหว่าง awk และตัดด้วย grep? [ปิด]
เรารู้ว่าเราสามารถรับคอลัมน์ที่สองของบรรทัดที่เราต้องการจากไฟล์โดยใช้เทคนิคทั้งสองนี้: awk '/WORD/ { print $2 }' filename หรือ grep WORD filename| cut -f 2 -d ' ' คำถามของฉันคือ: อะไรคือความแตกต่างระหว่างสองคำสั่งด้านบน? อันไหนมีประสิทธิภาพดีที่สุด? อะไรคือข้อดีของการใช้awkเกินกว่าcutและในทางกลับกัน? ตัวเลือกอะไรที่awkทำให้เรามีcutทางกลับกัน?
30 awk  grep  performance  cut 

2
ลบบรรทัดตามรายการที่ซ้ำกันภายในหนึ่งคอลัมน์โดยไม่มีการเรียงลำดับ
ฉันมีไฟล์ 3 คอลัมน์ขนาดใหญ่ (~ 10,000 บรรทัด) และฉันต้องการลบบรรทัดเมื่อเนื้อหาของคอลัมน์ที่สามของบรรทัดนั้นปรากฏในคอลัมน์ที่สามของอีกบรรทัดหนึ่ง ขนาดของไฟล์นั้นค่อนข้างยุ่งยากและฉันไม่สามารถใช้บางอย่างเช่นโค้ดด้านล่างได้เพราะทั้งบรรทัดนั้นไม่เหมือนกัน แค่เนื้อหาของคอลัมน์ 3 awk '!seen[$0]++' filename

6
จะใช้คำสั่ง shell เพื่อแสดงเฉพาะคอลัมน์แรกและคอลัมน์สุดท้ายในไฟล์ข้อความได้อย่างไร
ฉันต้องการความช่วยเหลือในการหาวิธีใช้คำสั่ง sed เพื่อแสดงเฉพาะคอลัมน์แรกและคอลัมน์สุดท้ายในไฟล์ข้อความ นี่คือสิ่งที่ฉันมีจนถึงคอลัมน์ 1: cat logfile | sed 's/\|/ /'|awk '{print $1}' ความพยายามที่อ่อนแอของฉันในการทำให้คอลัมน์สุดท้ายแสดงเช่นกันคือ: cat logfile | sed 's/\|/ /'|awk '{print $1}{print $8}' อย่างไรก็ตามการดำเนินการนี้จะใช้คอลัมน์แรกและคอลัมน์สุดท้ายแล้วรวมเข้าด้วยกันในรายการเดียว มีวิธีพิมพ์คอลัมน์แรกและคอลัมน์สุดท้ายอย่างชัดเจนด้วยคำสั่ง sed และ awk หรือไม่? ตัวอย่างอินพุต: foo|dog|cat|mouse|lion|ox|tiger|bar
30 shell  sed  awk 

12
ฉันจะเขียนไปยังบรรทัดที่สองของไฟล์จากบรรทัดคำสั่งได้อย่างไร
ฉันมีโปรแกรมภายนอกที่สร้างไฟล์เอาต์พุต (เป็นไปได้มากถึง 20K บรรทัด) ฉันต้องการแทรกบรรทัดใหม่ระหว่างบรรทัดที่ 1 ที่มีอยู่และบรรทัดที่ 2 ฉันดู awk และ sed - ฉันใช้ liners หนึ่งตัวในแต่ละข้อพอสมควร - แต่ฉันไม่สามารถหาสวิตช์ที่ถูกต้องได้ ทำเช่นนี้.

5
ลบช่วงของบรรทัดด้านบนรูปแบบด้วย sed (หรือ awk)
ฉันมีรหัสต่อไปนี้ที่จะลบบรรทัดที่มีรูปแบบbananaและ 2 บรรทัดหลังจากนั้น: sed '/banana/I,+2 d' file จนถึงตอนนี้ดีมาก! แต่ฉันต้องการมันเพื่อลบ 2 บรรทัดก่อนหน้า bananaแต่ฉันไม่สามารถรับมันด้วย "เครื่องหมายลบ" หรืออะไรก็ตาม (คล้ายกับสิ่งที่grep -v -B2 banana fileควรทำ แต่ไม่ได้ทำ): teresaejunior@localhost ~ > LC_ALL=C sed '-2,/banana/I d' file sed: invalid option -- '2' teresaejunior@localhost ~ > LC_ALL=C sed '/banana/I,-2 d' file sed: -e expression #1, char 16: unexpected `,' teresaejunior@localhost …

11
จะต้องมีวิธีที่ดีกว่าในการแทนที่บรรทัดใหม่เดียวเท่านั้นหรือ
ฉันติดนิสัยการเขียนหนึ่งบรรทัดต่อประโยคเพราะปกติแล้วฉันจะรวบรวมสิ่งต่าง ๆ ให้กับ LaTex หรือฉันกำลังเขียนในรูปแบบอื่นที่มีการละเว้นบรรทัด ฉันใช้บรรทัดว่างเพื่อระบุจุดเริ่มต้นของย่อหน้าใหม่ ตอนนี้ฉันมีไฟล์ที่เขียนในลักษณะนี้ซึ่งฉันต้องการส่งเป็นข้อความธรรมดา ฉันต้องการที่จะลบ linebreaks เดียวทั้งหมด แต่ปล่อยให้ linebreaks สองครั้งเหมือนเดิม นี่คือสิ่งที่ฉันทำ: sed 's/$^/NEWLINE/' file.txt | awk '{printf "%s ",$0}' | sed 's/NEWLINE/\n\n/g' > linebreakfile.txt สิ่งนี้แทนที่บรรทัดว่างด้วยข้อความบางอย่างที่ฉันมั่นใจว่าจะไม่ปรากฏในไฟล์: NEWLINEจากนั้นมันจะกำจัดตัวแบ่งบรรทัดทั้งหมดด้วย awk (ฉันพบเคล็ดลับในบางเว็บไซต์) จากนั้นมันจะแทนที่NEWLINEs ด้วยบรรทัดที่จำเป็นสองบรรทัด . ดูเหมือนว่าจะเป็นวิธีที่ยืดยาวในการทำสิ่งที่เรียบง่าย มีวิธีที่ง่ายกว่านี้ไหม? นอกจากนี้หากมีวิธีการแทนที่ช่องว่างหลาย ๆ ช่อง (ซึ่งบางครั้งอาจคืบไปด้วยเหตุผลบางอย่าง) ด้วยช่องว่างเดียวนั่นก็จะดีเช่นกัน ฉันใช้ emacs ดังนั้นหากมีเคล็ดลับเฉพาะของ emac ที่ดี แต่ฉันอยากเห็นรุ่นที่บริสุทธิ์หรือรุ่น awk ที่บริสุทธิ์

7
วิธีการเลือกการเกิดขึ้นครั้งแรกระหว่างสองรูปแบบรวมถึงพวกเขา
ฉันจะเลือกสิ่งที่เกิดขึ้นครั้งแรกระหว่างสองรูปแบบรวมถึงพวกเขา ควรใช้หรือsedawk ฉันมี: text something P1 something content1 content2 something P2 something text something P1 something content3 content4 something P2 something text ฉันต้องการเกิดขึ้นครั้งแรกของเส้นระหว่าง P1 และ P2 (รวมถึงสาย P1 และสาย P2): something P1 something content1 content2 something P2 something

8
วิธี grep-inverse-match และแยกบรรทัด“ before” และ“ after”
พิจารณาไฟล์ข้อความด้วยรายการต่อไปนี้: aaa bbb ccc ddd eee fff ggg hhh iii ด้วยรูปแบบ (เช่นfff) ฉันต้องการ grep ไฟล์ด้านบนเพื่อให้ได้ผลลัพธ์: all_lines except (pattern_matching_lines U (B lines_before) U (A lines_after)) ตัวอย่างเช่นถ้าB = 2และA = 1เอาต์พุตที่มี pattern = fffควรเป็น: aaa bbb ccc hhh iii ฉันจะทำสิ่งนี้กับ grep หรือเครื่องมือบรรทัดคำสั่งอื่น ๆ ได้อย่างไร หมายเหตุเมื่อฉันลอง: grep -v 'fff' -A1 -B2 file.txt ฉันไม่ได้สิ่งที่ฉันต้องการ …

5
วิธีรับส่วนสุดท้ายของลิงค์ http ใน Bash
ฉันมีลิงค์ http: http://www.test.com/abc/def/efg/file.jar และฉันต้องการบันทึกส่วนสุดท้าย file.jar เป็นตัวแปรดังนั้นสตริงเอาต์พุตคือ "file.jar" เงื่อนไข : ลิงค์มีความยาวต่างกันเช่น: http://www.test.com/abc/def/file.jar. ฉันลองแบบนั้น: awk -F'/' '{print $7}' แต่ปัญหาคือความยาวของ URL ดังนั้นฉันต้องการคำสั่งที่สามารถใช้สำหรับความยาว URL ใด ๆ
25 bash  shell-script  awk  cut 

4
วิธีแยกล็อกระหว่างการประทับเวลาสองครั้ง
ฉันต้องการแยกบันทึกทั้งหมดระหว่างการประทับเวลาสองครั้ง บางบรรทัดอาจไม่มีการประทับเวลา แต่ฉันต้องการเส้นเหล่านั้นด้วย ในระยะสั้นฉันต้องการทุกบรรทัดที่อยู่ภายใต้การประทับเวลาสองครั้ง โครงสร้างบันทึกของฉันดูเหมือนว่า: [2014-04-07 23:59:58] CheckForCallAction [ERROR] Exception caught in +CheckForCallAction :: null --Checking user-- Post [2014-04-08 00:00:03] MobileAppRequestFilter [DEBUG] Action requested checkforcall สมมติว่าผมต้องการที่จะดึงทุกอย่างระหว่างและ2014-04-07 23:002014-04-08 02:00 โปรดทราบว่าการประทับเวลาเริ่มต้นหรือการประทับเวลาสิ้นสุดอาจไม่มีอยู่ในบันทึก แต่ฉันต้องการทุกบรรทัดระหว่างการประทับเวลาสองครั้งนี้

10
วิธีลบบรรทัดใหม่หลายรายการที่ EOF
ฉันมีไฟล์ที่ลงท้ายด้วยการขึ้นบรรทัดใหม่อย่างน้อยหนึ่งบรรทัดและควรลงท้ายด้วยการขึ้นบรรทัดใหม่เพียงครั้งเดียว ฉันจะทำสิ่งนั้นด้วยเครื่องมือ Bash / Unix / GNU ได้อย่างไร ตัวอย่างไฟล์ที่ไม่ดี: 1\n \n 2\n \n \n 3\n \n \n \n ตัวอย่างไฟล์ที่แก้ไข: 1\n \n 2\n \n \n 3\n กล่าวอีกนัยหนึ่ง: ควรมีการขึ้นบรรทัดใหม่หนึ่งบรรทัดระหว่าง EOF และอักขระที่ไม่ใช่บรรทัดใหม่ล่าสุดของไฟล์ การดำเนินการอ้างอิง อ่านเนื้อหาไฟล์ตัดบรรทัดใหม่หนึ่งบรรทัดจนไม่มีบรรทัดใหม่อีกสองบรรทัดในตอนท้ายเขียนมันกลับมา: #! /bin/python import sys with open(sys.argv[1]) as infile: lines = infile.read() while lines.endswith("\n\n"): lines = lines[:-1] with open(sys.argv[2], 'w') …
25 bash  sed  awk  ed 

9
จะพิมพ์เฉพาะคอลัมน์สุดท้ายได้อย่างไร
echo -e 'one two three\nfour five six\nseven eight nine' one two three four five six seven eight nine ฉันจะทำ "MAGIC" บางอย่างเพื่อรับเอาต์พุตนี้ได้อย่างไร: three six nine อัปเดต: ฉันไม่ต้องการในวิธีนี้โดยเฉพาะฉันต้องการโซลูชันทั่วไปเพื่อให้ไม่ว่าจะมีคอลัมน์อยู่กี่แถวเช่น: awk แสดงคอลัมน์สุดท้ายเสมอ


8
วิธีลบคอลัมน์สุดท้ายของไฟล์ใน Linux
ฉันต้องการลบคอลัมน์สุดท้ายของไฟล์ txt ในขณะที่ฉันไม่ทราบว่าหมายเลขคอลัมน์คืออะไร ฉันจะทำสิ่งนี้ได้อย่างไร ตัวอย่าง: การป้อนข้อมูล: 1223 1234 1323 ... 2222 123 1233 1234 1233 ... 3444 125 0000 5553 3455 ... 2334 222 และฉันต้องการให้ผลลัพธ์ของฉันเป็น: 1223 1234 1323 ... 2222 1233 1234 1233 ... 3444 0000 5553 3455 ... 2334

9
วิธีลบทุกบรรทัดที่สองจากไฟล์ได้อย่างไร
ไฟล์: Data inserted into table. Total count 13 No error occurred Data inserted into table. Total count 45 No error occurred Data inserted into table. Total count 14 No error occurred Data inserted into table. Total count 90 No error occurred ไฟล์เอาต์พุตที่คาดหวัง: Data inserted into table. Total count 13 Data …

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