In cột bắt đầu bằng một chuỗi cụ thể


11

Tôi có một tập tin trông giống như thế này:

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

Như bạn có thể thấy, mỗi dòng có số lượng cột hơi khác nhau. Tôi đặc biệt muốn cột 1, cột 2, cột 3, cột 4 và cột bắt đầu bằngANC=

Kết quả mong muốn:

ID101     G    T     freq=.5     ANC=.1
ID102     A    T     freq=.3     ANC=.01
ID102     A    T     freq=.01    ANC=.02

Tôi thường sử dụng lệnh awk để phân tích các tệp:

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

Có cách nào dễ dàng để thay đổi lệnh này để làm việc cho các tình huống như thế này không?

Tôi nghĩ một cái gì đó như thế này có thể làm việc:

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

Tuy nhiên, làm thế nào tôi có thể chỉnh sửa điều này để in các cột đầu tiên?

Câu trả lời:


15

Với awk:

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

  • for(...)vòng lặp qua tất cả các trường, bắt đầu với trường 5 ( i=5).
    • if($i~/^ANC=/) kiểm tra nếu trường bắt đầu bằng ANC=
    • a=$i nếu có, đặt biến a thành giá trị đó
  • print $1,$2,$3,$4,ain các trường 1-4 theo sau bởi bất cứ điều gì được lưu trữ trong a.

Có thể kết hợp với BEGIN {OFS="\t"}tất nhiên.


những gì hiện i=5làm gì?
vũ trụ học

@ stellar01 điều này bắt đầu vòng lặp tại trường số 5.
hỗn loạn

0

Giả sử rằng ANC=cột luôn là cột thứ hai đến cuối cùng (như trong dữ liệu ví dụ):

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

NFlà số lượng các trường (cột) awkphân chia từng bản ghi (dòng) thành. $(NF-1)là giá trị của trường thứ hai đến cuối cùng.


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

Tóm tắt

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.