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

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

3
แทนที่สตริงจำนวนมากในการส่งผ่านครั้งเดียว
ฉันกำลังมองหาวิธีที่จะแทนที่สตริงตัวยึดตำแหน่งในไฟล์แม่แบบด้วยค่าที่เป็นรูปธรรมด้วยเครื่องมือ Unix ทั่วไป (ทุบตี, sed, awk, อาจ perl) เป็นสิ่งสำคัญที่การเปลี่ยนจะดำเนินการในรอบเดียวนั่นคือสิ่งที่สแกน / เปลี่ยนแล้วจะต้องไม่ถูกนำมาพิจารณาสำหรับการเปลี่ยนใหม่ ตัวอย่างเช่นความพยายามสองครั้งนี้ล้มเหลว: echo "AB" | awk '{gsub("A","B");gsub("B","A");print}' >> AA echo "AB" | sed 's/A/B/g;s/B/A/g' >> AA ผลลัพธ์ที่ถูกต้องในกรณีนี้คือหลักสูตร BA โดยทั่วไปการแก้ปัญหาควรเทียบเท่ากับการสแกนอินพุตจากซ้ายไปขวาสำหรับการจับคู่ที่ยาวที่สุดไปยังสตริงการแทนที่ที่กำหนดอย่างใดอย่างหนึ่งและสำหรับการแข่งขันแต่ละครั้งทำการแทนที่และดำเนินการต่อจากจุดนั้นบนอินพุต (ไม่มี อ่านอินพุตแล้วหรือการแทนที่ที่ดำเนินการควรพิจารณาให้ตรงกัน) ที่จริงแล้วรายละเอียดไม่สำคัญเพียงแค่ว่าผลของการเปลี่ยนจะไม่ถูกนำมาพิจารณาสำหรับการทดแทนอื่นทั้งหมดหรือบางส่วน หมายเหตุฉันกำลังมองหาโซลูชันทั่วไปที่ถูกต้องเท่านั้น โปรดอย่าเสนอวิธีแก้ปัญหาที่ล้มเหลวสำหรับอินพุตบางอย่าง (ไฟล์อินพุต, ค้นหาและแทนที่คู่) แต่ไม่น่าจะเป็นไปได้
11 bash  sed  awk  string  replace 

9
ฉันจะพิมพ์หมายเลขที่ยาวที่สุดในสตริงได้อย่างไร
ฉันกำลังมองหาวิธีการพิมพ์จำนวนที่ยาวที่สุดในสตริง เช่น: ถ้าฉันมีสตริง 212334123434test233 ฉันจะพิมพ์ได้อย่างไร 212334123434 ? หมายเหตุ: ฉันกำลังมองหาลำดับที่ต่อเนื่องยาวนานที่สุดของตัวเลขไม่ใช่ค่าที่สูงกว่าเป็นตัวเลข แก้ไข:ขอบคุณสำหรับคำตอบทุกคน การตอบคำถามนี้ค่อนข้างท่วมท้น ฉันทำเครื่องหมายโพสต์ของ @ HaukeLaging เป็นคำตอบที่ยอมรับได้เพราะมันเหมาะกับกรณีของฉันเป็นอย่างดี แต่ฉันต้องการชี้ให้เห็นว่าคำตอบทั้งหมดนั้นใช้ได้อย่างเท่าเทียมกัน เป็นเรื่องที่ดีเสมอที่จะมีตัวเลือกต่าง ๆ เพื่อแก้ไขปัญหา

3
ประมวลผลบรรทัดสุดท้ายก่อนโดยใช้ awk
ฉันมีไฟล์ข้อมูลที่ฉันต้องการทำให้เป็นมาตรฐานโดยใช้awkตามดาต้าพอยน์ล่าสุด ดังนั้นฉันต้องการเข้าถึงจุดข้อมูลสุดท้ายก่อนเพื่อทำให้ข้อมูลเป็นมาตรฐานและดำเนินการตามปกติ วิธีต่อไปนี้ใช้tacสองครั้งเพื่อทำงาน แต่อาจจะซับซ้อนกว่าที่จำเป็น $ cat file 0 5 1 2 2 3 3 4 $ tac file | awk 'NR==1{norm=$2} {print $1, $2/norm}' | tac 0 1.25 1 0.5 2 0.75 3 1 คำถามของฉันมีดังต่อไปนี้: เป็นไปได้หรือไม่ที่จะได้รับผลลัพธ์ข้างต้นโดยใช้ awk เท่านั้น ฉันคิดว่าคำตอบคือ "ไม่ awk สแกนไฟล์ทีละบรรทัด" แต่ฉันเปิดให้คำแนะนำสำหรับทางเลือก

2
awk เลขคณิตความแม่นยำสูง
ฉันกำลังมองหาวิธีที่จะบอก awk ให้ทำเลขคณิตความแม่นยำสูงในการดำเนินการทดแทน สิ่งนี้เกี่ยวข้องกับการอ่านฟิลด์จากไฟล์และแทนที่ด้วยการเพิ่มค่า 1% อย่างไรก็ตามฉันสูญเสียความแม่นยำที่นั่น นี่คือการทำสำเนาของปัญหาที่ง่ายขึ้น: $ echo 0.4970436865354813 | awk '{gsub($1, $1*1.1)}; {print}' 0.546748 ที่นี่ฉันมี 16 หลักหลังจากความแม่นยำทศนิยม แต่ awk ให้เพียงหก เมื่อใช้ printf ฉันจะได้ผลลัพธ์เดียวกัน: $ echo 0.4970436865354813 | awk '{gsub($1, $1*1.1)}; {printf("%.16G\n", $1)}' 0.546748 ข้อเสนอแนะเกี่ยวกับวิธีการได้รับความแม่นยำที่ต้องการ?

12
เป็นวิธีที่ดีในการกรองไฟล์ข้อความเพื่อลบบรรทัดว่างอะไร
ฉันมีไฟล์. csv (สำหรับ mac) ที่มีบรรทัดว่างมากมายเช่น: "1", "2", "lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum ","2","3","4" "1", "2", "lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum …

5
ลบบรรทัดที่ซ้ำกันที่อยู่ติดกันในขณะที่รักษาการสั่งซื้อ
ฉันมีไฟล์ที่มีหนึ่งคอลัมน์ที่มีชื่อที่ซ้ำหลายครั้งในแต่ละครั้ง ฉันต้องการรวมการทำซ้ำแต่ละครั้งเป็นหนึ่งในขณะที่การทำซ้ำชื่ออื่นที่มีชื่อเดียวกันที่ไม่ติดกับชื่อซ้ำกันอื่น ๆ เช่นฉันต้องการเลี้ยวซ้ายไปทางขวา: Golgb1 Golgb1 Golgb1 Akna Golgb1 Spata20 Golgb1 Golgb1 Golgb1 Akna Akna Akna Akna Spata20 Spata20 Spata20 Golgb1 Golgb1 Golgb1 Akna Akna Akna นี่คือสิ่งที่ฉันใช้: perl -ne 'print if ++$k{$_}==1' file.txt > file2.txt อย่างไรก็ตามวิธีนี้จะช่วยให้ตัวแทนหนึ่งคนจากด้านซ้ายเท่านั้น (เช่น Golb1 และ Akna ไม่ซ้ำกัน) มีวิธีในการเก็บชื่อที่ไม่ซ้ำกันสำหรับแต่ละบล็อกในขณะที่รักษาชื่อที่ทำซ้ำในบล็อกหลายบล็อกที่ไม่ติดกันหรือไม่
11 awk  sed  sort  uniq 

3
พิมพ์คอลัมน์ที่ขึ้นต้นด้วยสตริงที่ระบุ
ฉันมีไฟล์ที่มีลักษณะดังนี้: ID101 G T freq=.5 nonetype ANC=.1 addinfor ID102 A T freq=.3 ANC=.01 addinfor ID102 A T freq=.01 type=1 ALT=0.022 ANC=.02 addinfor อย่างที่คุณเห็นแต่ละบรรทัดมีจำนวนคอลัมน์แตกต่างกันเล็กน้อย ฉันต้องการคอลัมน์ 1 คอลัมน์ 2 คอลัมน์ 3 คอลัมน์ 4 และคอลัมน์ที่ขึ้นต้นด้วยANC= ผลลัพธ์ที่ต้องการ: ID101 G T freq=.5 ANC=.1 ID102 A T freq=.3 ANC=.01 ID102 A T freq=.01 ANC=.02 ฉันมักจะใช้คำสั่ง awk …

8
แยกไฟล์ข้อความเป็นบรรทัดที่มีจำนวนคำคงที่
ที่เกี่ยวข้อง แต่ไม่มีคำตอบที่น่าพอใจ: ฉันจะแยกไฟล์ข้อความขนาดใหญ่เป็นชิ้น ๆ จำนวน 500 คำได้อย่างไร ฉันพยายามที่จะใช้ไฟล์ข้อความ ( http://mattmahoney.net/dc/text8.zip ) ด้วย> 10 ^ 7 คำทั้งหมดในบรรทัดเดียวและแยกเป็นบรรทัดด้วยคำที่ไม่มีคำแต่ละคำ วิธีการปัจจุบันของฉันใช้งานได้ แต่ค่อนข้างช้าและน่าเกลียด (ใช้เชลล์สคริปต์): i=0 for word in $(sed -e 's/\s\+/\n/g' input.txt) do echo -n "${word} " > output.txt let "i=i+1" if [ "$i" -eq "1000" ] then echo > output.txt let "i=0" fi done …

3
คำสั่ง tr สามารถถูกโยงโซ่เพื่อหลีกเลี่ยงกระบวนการ tr หลายอย่างในไพพ์ไลน์หรือไม่?
ฉันมีไฟล์ txt มากมายฉันต้องการส่งออกตามลำดับที่ต่ำกว่ามีเพียงตัวอักษรและหนึ่งคำต่อบรรทัดฉันสามารถทำได้ด้วยtrคำสั่งต่าง ๆในขั้นตอนนี้: tr -d '[:punct:]' <doyle_sherlock_holmes.txt | tr '[:upper:]' '[:lower:]' | tr ' ' '\n' สามารถทำได้ในการสแกนครั้งเดียวหรือไม่? ฉันสามารถเขียนโปรแกรม C ที่จะทำเช่นนี้ แต่ฉันรู้สึกเหมือนมีวิธีที่จะทำมันได้ใช้tr, sed, หรือawkperl
11 sed  awk  perl  tr 

5
จะใช้เชลล์เพื่อรับที่อยู่ IPv6 จากที่อยู่ MAC ได้อย่างไร
เรารู้ว่าเราสามารถใช้ที่อยู่ MAC เพื่อสร้างตัวระบุอินเทอร์เฟซเช่นสำหรับที่อยู่ IPv6 ลิงก์ท้องถิ่นซึ่งควรจะไม่ซ้ำกันในเครือข่าย ภาพแสดงวิธีการทำสิ่งนี้: คำถามของฉันคือ: ฉันจะสร้างที่อยู่ IPv6 จาก MAC โดยใช้awkหรือsedอย่างไร หรือมีคำสั่งใดบ้างที่ให้ที่อยู่ IPv6 สำหรับการเชื่อมโยงท้องถิ่นสำหรับ MAC เฉพาะ (เช่นนั้นcreateIPv6 myMAC)
11 sed  awk  ipv6  mac-address 

2
เข้าร่วมสองไฟล์ที่มีคอลัมน์ที่ตรงกัน
File1.txt id No gi|371443199|gb|JH556661.1| 7907290 gi|371443198|gb|JH556662.1| 7573913 gi|371443197|gb|JH556663.1| 7384412 gi|371440577|gb|JH559283.1| 6931777 File2.txt id P R S gi|367088741|gb|AGAJ01056324.1| 5 5 0 gi|371443198|gb|JH556662.1| 2 2 0 gi|367090281|gb|AGAJ01054784.1| 4 4 0 gi|371440577|gb|JH559283.1| 21 19 2 output.txt id P R S NO gi|371443198|gb|JH556662.1| 2 2 0 7573913 gi|371440577|gb|JH559283.1| 21 19 2 6931777 File1.txt มีสองคอลัมน์ …
11 awk  join 

2
วิธีการเปลี่ยนไฟล์ในสถานที่โดยใช้ awk? (เช่นเดียวกับ“ sed -i”)
ฉันมีawkสคริปต์new.awk: BEGIN { FS=OFS="," } NR==1 { for (i=1; i<=NF; i++) { f[$i] = i } } NR > 1 { begSecs= mktime(gensub(/[":-]/," ","g",$(f["DateTime"]))) endSecs = begSecs + $(f["TotalDuration"]) $(f["CallEndTime"]) = strftime("%Y-%m-%d %H:%M:%S", endSecs) } { print } ฉันกำลังเรียกสิ่งนี้ในเปลือก awk new.awk sample.csv ... แต่ฉันเห็นการเปลี่ยนแปลงในเครื่อง วิธีการเปลี่ยนแปลงแบบแทนที่ไฟล์เช่นเมื่อใช้sed -i?
11 linux  shell  awk 

6
ลบบรรทัดที่ไม่ได้เริ่มต้นด้วยรูปแบบจากชุดรูปแบบที่กำหนด
ฉันมีไฟล์ที่มีข้อมูลเช่นนี้: report aaaaaaaa - .. -th bbbbbbbbb -to ccccccccc .. --. คำถาม: ฉันต้องการลบบรรทัดที่ไม่ได้ขึ้นต้นด้วยสตริงต่อไปนี้: report -th -to นั่นหมายถึงผลลัพธ์ที่ต้องการจะลบจุดและแฮชกลางที่ไม่ต้องการทั้งหมดออกและจะมีลักษณะเช่นนี้: report aaaaaaaa -th bbbbbbbbb -to ccccccccc sed/ awk/ grep/ ฯลฯ วิธีการแก้ปัญหาใด ๆ ที่จะทำงาน

5
วิธีการแปลงจากรูปแบบวันที่หนึ่งไปเป็นรูปแบบอื่น ๆ ?
ฉันมีปัญหาหนึ่งกับรูปแบบวันที่ของฉัน ฉันต้องการเปลี่ยนจากรูปแบบหนึ่งเป็นอีกรูปแบบหนึ่งและกลับกัน รูปแบบวันที่ของฉันคือ รูปแบบ 1 YYYY-MM-DD รูปแบบ 2 MM/DD/YYYY ฉันต้องการเปลี่ยนรูปแบบ 1 เป็นรูปแบบ 2 และจัดรูปแบบ 2 เป็นรูปแบบ 1

4
ปรับเปลี่ยนความกว้างของคอลัมน์แรกในไฟล์ด้วยจำนวนตัวแปรที่หลากหลายโดยใช้ awk
ฉันเข้าใจวิธีใช้ฟังก์ชั่น printf ของ awk แต่ฉันไม่ต้องการระบุทุกฟิลด์ ตัวอย่างเช่นสมมติว่านี่เป็นไฟล์ของฉัน: c1|c2|c3|c4|c5 c6|c7|c8|c9|c10 c11|c12|c13|c14|c15 ฉันต้องการจัดรูปแบบเพื่อให้ทุกเขตข้อมูลแรกของระเบียนคือความกว้างของ c11 - เซลล์ที่ยาวที่สุดในเขตข้อมูลแรก: c1 |c2|c3|c4|c5 c6 |c7|c8|c9|c10 c11|c12|c13|c14|c15 ฉันเข้าใจว่าฉันสามารถระบุ: awk -F"|" '{printf "%-3s%s%s%s%s\n", $1, $2, $3, $4, $5}' file > newfile สมมติว่าฉันรู้ว่าฉันต้องการให้ความกว้างของคอลัมน์แรกเป็นอย่างไร แต่ฉันไม่ทราบว่ามีกี่ฟิลด์ในไฟล์ โดยทั่วไปฉันต้องการทำสิ่งที่ชอบ: ... '{printf "%-3s|", $1}' ... จากนั้นพิมพ์ส่วนที่เหลือของฟิลด์ในรูปแบบดั้งเดิม

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