พิมพ์คอลัมน์ที่ขึ้นต้นด้วยสตริงที่ระบุ


11

ฉันมีไฟล์ที่มีลักษณะดังนี้:

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 เพื่อแยกไฟล์:

awk 'BEGIN {OFS = "\t"} {print $1, $2, $3, $4}'

มีวิธีง่าย ๆ ในการแก้ไขคำสั่งนี้ให้ทำงานในสถานการณ์เช่นนี้หรือไม่?

ฉันคิดว่าบางสิ่งเช่นนี้อาจใช้งานได้:

awk '{for(j=1;j<=NF;j++){if($j~/^ANC=/){print $j}}}'

อย่างไรก็ตามฉันจะแก้ไขสิ่งนี้เพื่อพิมพ์คอลัมน์แรกได้อย่างไร

คำตอบ:


15

ด้วยawk:

awk '{for(i=5;i<=NF;i++){if($i~/^ANC=/){a=$i}} print $1,$2,$3,$4,a}' file

  • for(...)วนi=5ซ้ำผ่านทุกฟิลด์เริ่มต้นด้วยฟิลด์ 5 ( )
    • if($i~/^ANC=/) ตรวจสอบว่าสนามเริ่มต้นด้วย ANC=
    • a=$i ถ้าใช่ตั้งค่าตัวแปรเป็นค่านั้น
  • print $1,$2,$3,$4,aสาขาการพิมพ์ 1-4 aตามด้วยสิ่งที่ถูกเก็บไว้ใน

สามารถใช้ร่วมกับBEGIN {OFS="\t"}แน่นอน


สิ่งที่ไม่i=5ทำอะไร?
cosmictypist

@ stellar01 สิ่งนี้จะเริ่มวนรอบที่หมายเลขฟิลด์ 5
ความวุ่นวาย

0

สมมติว่าANC=คอลัมน์เป็นคอลัมน์ที่สองถึงวันสุดท้ายเสมอ (ดังในข้อมูลตัวอย่าง):

$ awk '{ print $1, $2, $3, $(NF-1) }' data.in
ID101 G T ANC=.1
ID102 A T ANC=.01
ID102 A T ANC=.02

NFคือจำนวนเขตข้อมูล (คอลัมน์) ที่awkแยกแต่ละระเบียน (บรรทัด) ลงใน $(NF-1)คือค่าของฟิลด์ที่สองถึงครั้งสุดท้าย


0
perl -pale '$"="\t", $_="@{[@F[0..3],         grep {   /^ANC=/ } @F[4..$#F]]}"' yourfile
perl -lane '$,="\t",          print @F[0..3], grep {   /^ANC=/ } @F[4..$#F]'    yourfile
perl -lane '($,,$a)=("\t",0), print grep { $a++ < 4 or /^ANC=/ } @F'            yourfile

สั้น

$, => OFS @F[0..3]=>$F[0] $F[1] $F[2] $F[4]

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