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

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

4
เชื่อมต่อบรรทัดตามคอลัมน์แรกโดย awk หรือ sed
ฉันจะใช้awkในสถานการณ์ต่อไปนี้ได้อย่างไร? ฉันต้องการเชื่อมโยงบรรทัดที่ขึ้นต้นด้วยคอลัมน์เดียวกัน เฉพาะคอลัมน์แรกจะถูกเก็บไว้หลังจากที่เข้าร่วม (ในกรณีนี้aaa, www, hhh) ไฟล์อาจคั่นด้วยช่องว่างหรือแท็บ อินพุตตัวอย่าง: aaa bbb ccc ddd NULL NULL NULL aaa NULL NULL NULL NULL NULL NULL aaa bbb ccc NULL NULL NULL NULL www yyy hhh NULL NULL NULL NULL hhh 111 333 yyy ooo hyy uuuioooy hhh 111 333 yyy ooo hyy NULL …

8
การสลับคอลัมน์ไม่ จำกัด จำนวน
ฉันมีไฟล์ที่มีคอลัมน์ ดูตัวอย่างด้านล่าง: a b c ... z 1 2 3 ... 26 ฉันต้องการสลับคอลัมน์ทั้งหมดที่ 1 กลายเป็นครั้งสุดท้ายที่สองกลายเป็นหนึ่งก่อนที่ผ่านมา ... ฯลฯ z y x ... a 26 25 24 ... 1 มีซับ ( awkหรือsed) ที่ทำสิ่งนี้หรือไม่? ฉันรู้ว่าสามารถใช้งานได้awkเมื่อมีคอลัมน์เพียงไม่กี่คอลัมน์ แต่ฉันต้องการทำสิ่งนี้กับไฟล์ที่มีคอลัมน์หลายพันคอลัมน์ tacทำสิ่งนี้ได้อย่างสมบูรณ์แบบสำหรับบรรทัด ฉันเดาว่าฉันกำลังมองหาคอลัมน์ที่เทียบเท่า rev ไม่ได้ผลสำหรับฉันเพราะมันสลับเนื้อหาในคอลัมน์ด้วย

4
พิมพ์บรรทัดเฉพาะในกรณีที่บรรทัดถัดไปไม่มีการแข่งขันที่เฉพาะเจาะจง
ฉันพยายามค้นหาไฟล์บันทึกสำหรับกิจกรรมที่บันทึกไม่เสร็จสมบูรณ์ ตัวอย่างเช่นฉันบันทึก "กิจกรรมเริ่มต้นสำหรับ ID 1234 ... " และหากประสบความสำเร็จบรรทัดถัดไปจะเป็น "กิจกรรม 1234 เสร็จสมบูรณ์" ฉันพยายามรับบรรทัด "เริ่มต้น ... " ที่ไม่ได้ตามด้วยบรรทัด "เสร็จสมบูรณ์" ที่เกี่ยวข้อง ตัวอย่างไฟล์บันทึก Starting activity for ID 1234 ID 1234 completed successfully Starting activity for ID 3423 ID 3423 completed successfully Starting activity for ID 9876 ID 9876 completed successfully Starting activity for ID …
12 grep  sed  awk 

3
พิมพ์คอลัมน์ใน awk ตามชื่อส่วนหัว
ฉันมีไฟล์ข้อความเช่นนั้น foo bar baz 1 a alpha 2 b beta 3 c gamma ฉันสามารถใช้ awk พิมพ์คอลัมน์บางอย่างเช่น 1 และ 3 ด้วยแต่ผมต้องการระบุคอลัมน์ที่จะพิมพ์โดยการระบุส่วนหัวของคอลัมน์แทนสิ่งที่ชอบ{print $1, $3} {print $foo, $baz}สิ่งนี้มีประโยชน์ดังนั้นฉันจึงไม่ต้องเปิดไฟล์และนับคอลัมน์ด้วยตนเองเพื่อดูว่าคอลัมน์ใดอยู่และฉันไม่จำเป็นต้องอัปเดตสคริปต์หากหมายเลขคอลัมน์หรือคำสั่งซื้อเปลี่ยนแปลง ฉันสามารถทำสิ่งนี้ด้วย awk (หรือเครื่องมือเชลล์อื่น) ได้หรือไม่

3
จะแสดงเฉพาะบรรทัดสุดท้ายของรายชื่อได้อย่างไร
สมมติว่าฉันสร้างรายชื่อและจัดเรียงไฟล์ตามคุณสมบัติชั่วคราว: ls -ltr -rwxrwxrwx 1 bla bla 4096 Feb 01 20:10 foo1 -rwxrwxrwx 1 bla bla 4096 Feb 01 20:12 foo2 . . . -rwxrwxrwx 1 bla bla 4096 Mar 05 13:25 foo1000 ฉันควรเพิ่มอะไรไว้ด้านหลัง ls -ltr ในไปป์ไลน์เพื่อรับเฉพาะบรรทัดสุดท้ายของรายชื่อ ฉันรู้ว่ามีคนใจอ่อนและตกใจ แต่ฉันไม่รู้วิธีใช้พวกเขาฉันรู้ว่าพวกเขาสามารถทำอะไรได้บ้าง
12 command-line  sed  awk  ls 

2
ฉันจะแยกสตริงเอเจนต์ผู้ใช้ออกจากล็อกไฟล์ได้อย่างไร
ขณะนี้ฉันกำลังใช้คำสั่งเช่นนี้เพื่อรับเนื้อหาที่ต้องการมากที่สุด: grep "17\/Jul\/2011" other_vhosts_access.log | awk '{print $8}' | sort | uniq -c | sort -nr ตอนนี้ฉันต้องการดูสตริงตัวแทนผู้ใช้ แต่ปัญหาคือพวกเขามีช่องว่างหลายแห่ง นี่คือบรรทัดไฟล์บันทึกทั่วไป UA เป็นส่วนสุดท้ายคั่นด้วยเครื่องหมายคำพูด: example.com:80 [ip] - - [17/Jul/2011:23:59:59 +0100] "GET [url] HTTP/1.1" 200 6449 "[referer]" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.122 Safari/534.30" มีเครื่องมือที่ดีกว่า awk สำหรับเรื่องนี้หรือไม่?
12 logs  awk 

3
การกระจายสคริปต์: ฉันควรใช้ / bin / gawk หรือ / usr / bin / gawk สำหรับ shebang หรือไม่
เหยี่ยวใน / bin หรือ / usr / bin เป็นปกติหรือไม่? ฉันจะไปด้วย#!/usr/bin/env gawkแต่แล้วฉันก็ไม่สามารถใช้การโต้แย้ง #!/bin/gawk -fตอนนี้ผมใช้ สคริปต์ยาวมากและมีคำพูดเดียวจำนวนมากและใช้งานได้กับ stdin คู่มือ GNU Awk มีส่วน 1.1.4 โปรแกรมปฏิบัติการ awkที่ใช้ #! / bin / awk ในตัวอย่าง แต่จะพูดต่อไปว่า: โปรดทราบว่าในระบบจำนวนมากawkอาจพบได้ในแทนใน/usr/bin /binCaveat Emptor คนส่วนใหญ่ทำอะไร ฉันได้อ่านsed แล้วจะถือว่าเป็นมาตรฐานใน / binในขณะที่ perl นั้นควรจะเป็นมาตรฐานใน / usr / bin (หน้าเดียวกับ sed link แต่พวกเขาจะไม่ให้ฉันสร้างลิงค์ที่สามสำหรับโพสต์นี้) แล้ว awk / …
12 awk  shebang  env 

2
คำสั่งเพื่อลบจำนวน N บรรทัดแรกในอินพุต
พื้นหลัง ฉันใช้เซิร์ฟเวอร์ SSH และมีผู้ใช้ที่ฉันต้องการลบ ฉันไม่สามารถลบผู้ใช้รายนี้ได้เนื่องจากเขากำลังใช้งานกระบวนการบางอย่างที่ฉันต้องฆ่าเสียก่อน นี่คือขั้นตอนที่ฉันใช้อยู่ในขณะนี้เพื่อค้นหารหัสกระบวนการทั้งหมดของผู้ใช้ที่ฉันกำลังใช้: ps -u user | awk '{print $1;}' ผลลัพธ์มีลักษณะดังนี้: PID 2121 2122 2124 2125 2369 2370 ฉันต้องการไปป์นี้เพื่อkill -9ฆ่ากระบวนการทั้งหมดเพื่อให้ฉันสามารถลบผู้ใช้ที่โง่เช่นนี้: ps -u user | awk '{print $1;}' | sudo xargs kill -9 แต่สิ่งนี้ไม่ทำงานเนื่องจากPIDหัวข้อ: kill: failed to parse argument: 'PID' คำถาม ฉันคิดว่าจะต้องมีคำสั่ง Unix ง่าย ๆ เพื่อลบบรรทัดแรกของอินพุต ฉันรู้ว่าฉันสามารถใช้ tailสิ่งนี้ได้ …
11 command-line  sed  awk  tail  head 

4
วิธีที่จะทำให้การค้นหาสตริงด้วยคำสั่ง grep เป็นคำสั่ง if?
ฉันต้องการค้นหาหลายสายในสองไฟล์ หากพบหนึ่งสตริงในไฟล์ทั้งสองให้สร้างบางอย่าง หากพบหนึ่งสตริงในไฟล์เดียวให้สร้างอีกอย่าง คำสั่งของฉันคือต่อไป: ####This is for the affirmative sentence in both files if grep -qw "$users" "$file1" && grep -qw "$users" "$file2"; then ####This is for the affirmative sentence in only one file, and negative for the other one if grep -qw "$users" "$file1" ! grep -qw "$users" "$file2"; …

7
ฉันจะแก้ไขบรรทัดที่แตกในตำแหน่งที่ไม่ถูกต้องได้อย่างไร
ไฟล์ข้อความของฉันมีลักษณะเช่นนี้: This is one sentence that is broken. However this is a good one. And this one is somehow, broken into many. ฉันต้องการลบอักขระบรรทัดใหม่ต่อท้ายสำหรับบรรทัดใด ๆ ที่ตามด้วยบรรทัดที่ขึ้นต้นด้วยตัวอักษรตัวพิมพ์เล็ก ดังนั้นควรเป็น: This is one sentence that is broken. However this is a good one. And this one is somehow, broken into many. ฉันจะทำสิ่งนี้ได้อย่างไร แก้ไข: มีคำตอบที่ดีจริงๆที่นี่ …

2
ฉันจะพิมพ์ค่า ASCII (ตัวเลข) ของอักขระแต่ละตัวในไฟล์ได้อย่างไร
ฉันจะพิมพ์ค่า ASCII ตัวเลขของอักขระแต่ละตัวในไฟล์ข้อความได้อย่างไร กดcatไลค์ แต่แสดงค่า ASCII เท่านั้น ... (ฐานสิบหกหรือทศนิยมเป็นปกติ) ตัวอย่างเอาต์พุตสำหรับไฟล์ที่มีคำว่าApple (ที่มีการป้อนบรรทัด) อาจมีลักษณะดังนี้: 065 112 112 108 101 013 004
11 linux  bash  sed  awk  terminal 

2
awk memory รั่ว?
ฐานบนนี้ผมใช้คำสั่ง < /dev/urandom hexdump -v -e '/1 "%u\n"' | awk '{ split("0,2,4,5,7,9,11,12",a,","); for (i = 0; i < 1; i+= 0.0001) printf("%08X\n", 100*sin(1382*exp((a[$1 % 8]/12)*log(2))*i)) }' | xxd -r -p | sox -traw -r44100 -b16 -e unsigned-integer - -tcoreaudio ฉันสังเกตเห็นว่าหน่วยความจำที่ awk ใช้เพิ่มขึ้นอย่างต่อเนื่องในขณะที่คำสั่งนี้กำลังทำงานตัวอย่างเช่นการใช้หน่วยความจำเกิน 500MB ภายในเวลาที่เล่นข้อมูลเสียงดิบ 75MB คำสั่งอื่น ๆ ทั้งหมดในไปป์ไลน์รักษาจำนวนหน่วยความจำให้คงที่ awk ใช้หน่วยความจำนี้เพื่ออะไรและมีทางเลือกอื่นที่การประมวลผลสตรีมแบบตั้งใจจะใช้หน่วยความจำเพียงจำนวนเท่าไร? …
11 awk  osx  memory 

4
คู่ผลรวมของคอลัมน์ตามเขตข้อมูลที่ตรงกัน
ฉันมีไฟล์ขนาดใหญ่ในรูปแบบต่อไปนี้: 2 1019 0 12 2 1019 3 0 2 1021 0 2 2 1021 2 0 2 1022 4 5 2 1030 0 1 2 1030 5 0 2 1031 4 4 หากค่าในคอลัมน์ 2ตรงกันฉันต้องการรวมผลรวมในคอลัมน์ 3และ4ของทั้งสองบรรทัดหรือจะรวมเพียงผลรวมของค่าในบรรทัดที่ไม่ซ้ำกัน ดังนั้นผลลัพธ์ที่ฉันหวังไว้จะเป็นดังนี้: 2 1019 15 2 1021 4 2 1022 9 2 1030 6 2 …

2
ทำดัชนีไฟล์ CSV ใหม่อีกครั้ง
ฉันได้คำตอบในหัวข้อที่เป็นประโยชน์นี้แต่ปัญหาของฉันดูเหมือนจะแตกต่างกันพอที่ฉันไม่สามารถคิดถึงคำตอบที่ดี (อย่างน้อยก็ด้วยsed) ฉันมีไฟล์ CSV ขนาดใหญ่ (200+ GB) พร้อมแถวที่มีลักษณะดังนี้: <alphanumerical_identifier>,<number> ที่<alphanumerical_identifier>ไม่ซ้ำกันในไฟล์ทั้งหมด ฉันต้องการสร้างไฟล์แยกที่แทนที่คอลัมน์แรกด้วยดัชนีเช่น <index>,<number> เพื่อให้เราได้รับ: 1, <number> 2, <number> 3, <number> สามารถawkสร้างดัชนีที่เพิ่มขึ้นโดยไม่โหลดไฟล์เต็มในหน่วยความจำได้ไหม? เนื่องจากดัชนีเพิ่มขึ้นแบบ monotonically มันอาจจะดีกว่าถ้าจะวางดัชนี วิธีแก้ปัญหาสำหรับสิ่งนั้นจะแตกต่างกันหรือไม่เช่น: <number> <number> <number>
11 files  sed  awk  csv 

6
ฉันจะแสดงความแตกต่างระหว่าง 2 ไฟล์ได้อย่างไร
ไฟล์ของฉันประกอบด้วยสิ่งต่อไปนี้; ประมาณ: username:username:username:username:username บรรทัดด้านบนยังคงประมาณ 600 อักขระ ฉันใช้awkคำสั่งเพื่อใช้เป็นอาร์กิวเมนต์ในคำขอ API / HTTP ที่ส่งจากบรรทัดคำสั่ง ฉันกำลังใช้สคริปต์เพื่อรับรายการบัญชีผู้ใช้ 'ติดตาม' ฉันและทุก ๆ 24 ชั่วโมงหรือมากกว่านั้นเปรียบเทียบรายการต้นฉบับบนฮาร์ดดิสก์ของฉันกับรายการชื่อผู้ใช้ที่เพิ่งแสดงผลใหม่ (และแสดงว่าใครไม่ได้ติดตาม ฉัน . ฉันจะต้องสรุปตรรกะของฉันเป็นลูปโดยใช้ bash .. ทดสอบชื่อผู้ใช้แต่ละคน สคริปต์ปัจจุบันของฉัน: user=$(awk -F: '{ print $1 }' FILE) # Grab $User to use as an argument. following=$(exec CURRENT_FOLLOWERS) # Outputs the new file echo "X amount …

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