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

AWK เป็นภาษาการเขียนโปรแกรมตีความตีความที่ออกแบบมาสำหรับการประมวลผลข้อความและโดยทั่วไปจะใช้เป็นเครื่องมือในการสกัดข้อมูลและการรายงาน AWK ส่วนใหญ่ใช้กับระบบ Unix

17
มียูทิลิตี้ Unix ในการเพิ่มการประทับเวลาไปยัง stdin หรือไม่?
ฉันลงเอยด้วยการเขียนสคริปต์สั้น ๆ สำหรับเรื่องนี้ใน Python แต่ฉันสงสัยว่ามียูทิลิตี้ที่คุณสามารถป้อนข้อความซึ่งจะเติมแต่ละบรรทัดด้วยข้อความบางส่วน - ในกรณีเฉพาะของฉัน เป็นการดีที่การใช้งานจะเป็นเช่น: cat somefile.txt | prepend-timestamp (ก่อนที่คุณจะตอบคำถามฉันพยายามทำสิ่งนี้: cat somefile.txt | sed "s/^/`date`/" แต่จะประเมินค่าคำสั่ง date เพียงครั้งเดียวเมื่อทำการประมวลผล sed ดังนั้นการประทับเวลาเดียวกันจะถูกเตรียมไว้อย่างไม่ถูกต้องกับแต่ละบรรทัด)
168 unix  shell  awk 

8
bash: วิธีที่สั้นที่สุดในการรับคอลัมน์ที่ n ของผลลัพธ์
สมมติว่าในระหว่างวันทำงานของคุณคุณจะพบรูปแบบต่อไปนี้ของเอาต์พุตคอลัมน์จากคำสั่งบางคำใน bash (ในกรณีของฉันจากการดำเนินการsvn stในไดเรกทอรีทำงาน Rails ของฉัน): ? changes.patch M app/models/superman.rb A app/models/superwoman.rb เพื่อทำงานกับเอาต์พุตของคำสั่งของคุณ - ในกรณีนี้ชื่อไฟล์ - จำเป็นต้องมีการแยกวิเคราะห์บางอย่างเพื่อให้คอลัมน์ที่สองสามารถใช้เป็นอินพุตสำหรับคำสั่งถัดไป สิ่งที่ฉันได้ทำคือการใช้awkเพื่อรับที่คอลัมน์ที่สองเช่นเมื่อฉันต้องการลบไฟล์ทั้งหมด (ไม่ใช่ว่าเป็น usecase ทั่วไป :) ฉันจะทำ: svn st | awk '{print $2}' | xargs rm เนื่องจากฉันพิมพ์สิ่งนี้บ่อยๆคำถามธรรมชาติคือ: มีวิธีที่สั้นกว่า หมายเหตุ: สิ่งที่ฉันถามเป็นหลักเป็นคำถามคำสั่งเชลล์แม้ว่าตัวอย่างที่เป็นรูปธรรมของฉันอยู่ในเวิร์กโฟลว์ svn ของฉัน หากคุณรู้สึกว่าเวิร์กโฟลว์นั้นโง่และแนะนำวิธีการอื่นฉันอาจไม่ลงคะแนนให้คุณ แต่คนอื่น ๆ อาจเนื่องจากคำถามที่นี่เป็นวิธีการรับเอาต์พุตคอลัมน์คำสั่ง n-th ใน bash อย่างสั้นที่สุดเท่าที่จะทำได้ . ขอบคุณ :)
166 bash  awk 

9
พิมพ์คอลัมน์ / ฟิลด์สุดท้ายที่สองใน awk
ฉันต้องการพิมพ์คอลัมน์หรือฟิลด์สุดท้ายที่สองใน awk จำนวนฟิลด์เป็นตัวแปร ฉันรู้ว่าฉันควรใช้งาน$NFได้ แต่ไม่แน่ใจว่าจะใช้งานได้อย่างไร และนี่ดูเหมือนจะไม่ทำงาน: awk ' { print ( $NF-- ) } '
164 awk  gawk 

22
ฉันจะลบบรรทัดใหม่ได้อย่างไรถ้าเป็นอักขระตัวสุดท้ายในไฟล์
ฉันมีไฟล์บางไฟล์ที่ฉันต้องการลบขึ้นบรรทัดใหม่หากเป็นอักขระตัวสุดท้ายในไฟล์ od -cแสดงให้ฉันเห็นว่าคำสั่งที่ฉันเรียกใช้นั้นเขียนไฟล์ด้วยการขึ้นบรรทัดใหม่: 0013600 n t > \n ฉันได้ลองเล่นเล่ห์เหลี่ยมเล็กน้อย แต่สิ่งที่ดีที่สุดที่ฉันคิดได้คือไม่ได้เล่นเล่ห์เหลี่ยม: sed -e '$s/\(.*\)\n$/\1/' abc ความคิดใด ๆ วิธีการทำเช่นนี้?
162 linux  perl  shell  awk  sed 

8
วิธีรับคอลัมน์ที่สองจากเอาต์พุตคำสั่ง?
เอาต์พุตของคำสั่งของฉันเป็นดังนี้: 1540 "A B" 6 "C" 119 "D" คอลัมน์แรกจะเป็นตัวเลขเสมอตามด้วยช่องว่างแล้วจึงเป็นสตริงที่มีเครื่องหมายคำพูดคู่ จุดประสงค์ของฉันคือการได้รับคอลัมน์ที่สองเท่านั้นเช่น: "A B" "C" "D" ฉันตั้งใจจะใช้<some_command> | awk '{print $2}'เพื่อให้บรรลุสิ่งนี้ แต่คำถามก็คือค่าบางค่าในคอลัมน์ที่สองมีช่องว่างซึ่งเป็นตัวคั่นเริ่มต้นสำหรับawkแยกเขตข้อมูล ดังนั้นผลลัพธ์จะเลอะ: "A "C" "D" ฉันจะรับค่าคอลัมน์ที่สองได้อย่างไร (ด้วยเครื่องหมายคำพูดคู่) อย่างสะอาด?
152 shell  awk  ksh 

21
วิธีการรวมทุกสองบรรทัดเป็นหนึ่งเดียวจากบรรทัดคำสั่ง?
ฉันมีไฟล์ข้อความที่มีรูปแบบดังต่อไปนี้ บรรทัดแรกคือ "KEY" และบรรทัดที่สองคือ "VALUE" KEY 4048:1736 string 3 KEY 0:1772 string 1 KEY 4192:1349 string 1 KEY 7329:2407 string 2 KEY 0:1774 string 1 ฉันต้องการค่าในบรรทัดเดียวกับคีย์ ดังนั้นผลลัพธ์ควรมีลักษณะเช่นนี้ ... KEY 4048:1736 string 3 KEY 0:1772 string 1 KEY 4192:1349 string 1 KEY 7329:2407 string 2 KEY 0:1774 string 1 มันจะดีกว่าถ้าฉันสามารถใช้ตัวคั่นบางตัวเช่น$หรือ,: KEY …
151 bash  awk  sed  grep 

9
จะลบบรรทัดที่ซ้ำกันในไฟล์โดยไม่เรียงลำดับใน Unix ได้อย่างไร?
มีวิธีลบบรรทัดที่ซ้ำกันในไฟล์ใน Unix หรือไม่? ฉันสามารถทำได้ด้วยsort -uและuniqคำสั่ง แต่ฉันต้องการใช้sedหรือawk. เป็นไปได้หรือไม่
148 unix  shell  scripting  sed  awk 

9
แทรกบรรทัดที่หมายเลขบรรทัดเฉพาะด้วย sed หรือ awk
ฉันมีไฟล์สคริปต์ที่ฉันต้องแก้ไขด้วยสคริปต์อื่นเพื่อแทรกข้อความที่บรรทัดที่ 8 สตริงที่จะแทรก: ลงในไฟล์ที่เรียกว่าProject_Name=sowsteststart ฉันพยายามใช้ awk และ sed แต่คำสั่งของฉันกำลังสับสน
146 sed  awk 

8
บันทึกการแก้ไขในสถานที่ด้วย awk
ฉันกำลังเรียนรู้awkและต้องการทราบว่ามีตัวเลือกในการเขียนการเปลี่ยนแปลงในไฟล์หรือไม่คล้ายกับsedที่ฉันจะใช้-iตัวเลือกเพื่อบันทึกการแก้ไขลงในไฟล์ ฉันเข้าใจว่าฉันสามารถใช้การเปลี่ยนเส้นทางเพื่อเขียนการเปลี่ยนแปลงได้ อย่างไรก็ตามมีทางเลือกในawkการทำเช่นนั้นหรือไม่?
140 linux  unix  awk 

10
เรียงไฟล์ข้อความตามความยาวบรรทัดรวมถึงช่องว่าง
ฉันมีไฟล์ CSV ที่มีลักษณะเช่นนี้ AS2345, ASDF1232, ตัวอย่างนายธรรมดา, 110 Binary ave., แอตแลนติส, RI, 12345, (999) 123-5555,1.56 AS2345, ASDF1232 นางตัวอย่างธรรมดา 1121110 Ternary st. 110 Binary ave .. , Atlantis, RI, 12345, (999) 123-5555,1.56 AS2345, ASDF1232, ตัวอย่างนายธรรมดา, 110 Binary ave., Liberty City, RI, 12345, (999) 123-5555,1.56 AS2345, ASDF1232, ตัวอย่างนายธรรมดา, 110 Ternary ave., บางเมือง, RI, …
137 bash  sorting  text  awk 

11
การพิมพ์คอลัมน์สุดท้ายของบรรทัดในไฟล์
ฉันมีไฟล์ที่กำลังเขียน / อัปเดตอยู่ตลอดเวลา ฉันต้องการค้นหาบรรทัดสุดท้ายที่มีคำใดคำหนึ่งจากนั้นพิมพ์คอลัมน์สุดท้ายของบรรทัดนั้น ไฟล์มีลักษณะดังนี้ บรรทัด A1 / B1 / C1 เพิ่มเติมจะถูกต่อท้ายเมื่อเวลาผ่านไป A1 123 456 B1 234 567 C1 345 678 A1 098 766 B1 987 6545 C1 876 5434 ฉันพยายามที่จะใช้ tail -f file | grep A1 | awk '{print $NF}' เพื่อพิมพ์ค่า 766 แต่ไม่มีผลลัพธ์ใด ๆ มีวิธีทำไหม?
136 file  awk  tail 

9
วิธีเลือกเส้นระหว่างรูปแบบเครื่องหมายสองรูปแบบซึ่งอาจเกิดขึ้นหลายครั้งด้วย awk / sed
ใช้awkหรือsedฉันจะเลือกเส้นที่เกิดขึ้นระหว่างรูปแบบเครื่องหมายสองแบบที่แตกต่างกันได้อย่างไร อาจมีหลายส่วนที่ทำเครื่องหมายด้วยรูปแบบเหล่านี้ ตัวอย่างเช่นสมมติว่าไฟล์มี: abc def1 ghi1 jkl1 mno abc def2 ghi2 jkl2 mno pqr stu และรูปแบบเริ่มต้นคือabcและรูปแบบสิ้นสุดคือmno ดังนั้นฉันต้องการผลลัพธ์เป็น: def1 ghi1 jkl1 def2 ghi2 jkl2 ฉันใช้ sed เพื่อจับคู่รูปแบบครั้งเดียว: sed -e '1,/abc/d' -e '/mno/,$d' <FILE> มีวิธีใดsedหรือawk ต้องทำซ้ำ ๆ จนจบไฟล์?

10
วิธีใช้หลายอาร์กิวเมนต์สำหรับ awk กับ shebang (เช่น #!)
ฉันต้องการเรียกใช้สคริปต์gawk--re-intervalโดยใช้ shebang แนวทาง "ไร้เดียงสา" ของ #!/usr/bin/gawk --re-interval -f ... awk script goes here ใช้งานไม่ได้เนื่องจาก gawk ถูกเรียกด้วยอาร์กิวเมนต์แรก"--re-interval -f"(ไม่ถูกแยกออกจากช่องว่าง) ซึ่งไม่เข้าใจ มีวิธีแก้ปัญหาสำหรับสิ่งนั้นหรือไม่? แน่นอนคุณไม่สามารถเรียก gawk ได้โดยตรง แต่รวมไว้ในเชลล์สคริปต์ที่แยกอาร์กิวเมนต์แรกหรือสร้างเชลล์สคริปต์ที่เรียกว่า gawk และใส่สคริปต์ลงในไฟล์อื่น แต่ฉันสงสัยว่ามีวิธีทำหรือไม่ นี้ภายในไฟล์เดียว ลักษณะการทำงานของเส้น Shebang แตกต่างกันไปในแต่ละระบบ - อย่างน้อยในCygwinจะไม่แบ่งอาร์กิวเมนต์ด้วยช่องว่าง ฉันแค่สนใจว่าจะทำอย่างไรกับระบบที่มีพฤติกรรมเช่นนั้น สคริปต์ไม่ได้มีไว้สำหรับพกพา
118 shell  unix  awk  gawk  shebang 


8
จะพิมพ์รูปแบบ regex ที่ตรงกันโดยใช้ awk ได้อย่างไร
โดยใช้awkฉันต้องหาคำในไฟล์ที่ตรงกับรูปแบบนิพจน์ทั่วไป ฉันเพียงต้องการพิมพ์คำว่าจับคู่กับรูปแบบ ดังนั้นหากอยู่ในบรรทัดฉันมี: xxx yyy zzz และรูปแบบ: /yyy/ ฉันต้องการเพียงแค่: yyy แก้ไข: ขอบคุณkurumiฉันจัดการเขียนสิ่งนี้: awk '{ for(i=1; i<=NF; i++) { tmp=match($i, /[0-9]..?.?[^A-Za-z0-9]/) if(tmp) { print $i } } }' $1 และนี่คือสิ่งที่ฉันต้องการ :) ขอบคุณมาก!
112 regex  awk 

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