จะแทนที่เนื้อหาของคอลัมน์ใดคอลัมน์หนึ่งด้วย awk ได้อย่างไร?


31

รับ: มี 40 คอลัมน์ในการบันทึกเป็น ฉันต้องการแทนที่คอลัมน์ 35 เพื่อให้คอลัมน์ 35 ถูกแทนที่ด้วยเนื้อหาของคอลัมน์ 35 และสัญลักษณ์ "$" สิ่งที่อยู่ในใจคือ:

awk '{print $1" "$2" "...$35"$ "$36...$40}'

มันใช้งานได้ แต่เพราะมันเป็นไปไม่ได้เมื่อจำนวนคอลัมน์มีขนาดใหญ่เท่ากับ 10k ฉันต้องการวิธีที่ดีกว่าในการทำสิ่งนี้

คำตอบ:



8

อาจมีวิธีที่มีประสิทธิภาพมากกว่านี้ ด้วยข้อแม้นั้น:

awk '{$35 = $35"$"; print}' infile > outfile

3

หากตัวคั่นฟิลด์คือ<space>:

sed 's/  */$&/35'

หากไม่ทราบตัวคั่นเขตข้อมูล:sed 's/./$&/35'
เลิกทำ

@Underverse - ฉันไม่คิดว่านั่นเป็นสิ่งเดียวกัน ที่ควรจะนำหน้าตัวอักษรตัวที่ 35 ในบรรทัดอินพุต$ด้วยตัวคั่นหรือไม่ สิ่งที่กล่าวมาข้างต้นควรติดอยู่ที่ 35 ของจำนวนตัวคั่นใด ๆ - กล่าวอีกนัยหนึ่งคือฟิลด์ที่ 35 - กับอักขระ$- ไม่ว่าอักขระจะอยู่ในแต่ละฟิลด์อย่างไร
mikeserv

อ่า "40 คอลัมน์ในบันทึก" ฉันอ่าน 'คอลัมน์ที่ 35' ตามตัวอักษร 'คอลัมน์ตัวที่ 35 ของไฟล์ข้อความ'
Underverse

3

หากต้องการสำรองตัวคั่นฟิลด์เดิมฉันทำสิ่งนี้ คอลัมน์ที่ฉันต้องการลบออกคือหมายเลข $ 12

awk -F"\t" '{OFS=FS}{ $12="" ; print   }' infile.txt > outfile.txt

ด้วยgawk -iถ้าคุณมีคุณสามารถแก้ไขไฟล์ในสถานที่


1

มีปัญหาในการใช้คำตอบ "อนุมัติ" มันจะแทนที่มากกว่าคอลัมน์แรกในไฟล์ ฉันใช้คำสั่งทั่วไปนี้:

awk '$[column]="[replace]"' FS=, OFS=, inputfile > outputfile

ที่ไหน:

  • [column] = คอลัมน์ที่คุณต้องการเปลี่ยนเริ่มต้นด้วย 1 (ไม่ใช่ 0)
  • [replace] = ข้อความที่คุณต้องการแทนที่

awk '$1=mktime($1)' FS=, OFS=, oldfile > newfile ... แทนที่หนึ่งล้าน timestamps ในไม่กี่วินาที !! :)
roblogic
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.