特定の文字列で始まる列を出力する


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(...)フィールド5(i=5)で始まるすべてのフィールドをループします。
    • if($i~/^ANC=/) フィールドが次で始まるかどうかを確認します ANC=
    • a=$i はいの場合、変数aをその値に設定します
  • print $1,$2,$3,$4,aフィールド1から4を印刷し、その後にa

BEGIN {OFS="\t"}もちろん組み合わせることができます。


何をしi=5ますか?
宇宙飛行士、

@ stellar01これはフィールド番号5のループを開始
混沌

0

ANC=列が常に最後から2番目の列であると想定します(例のデータのように):

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

NFawk各レコード(行)を分割するフィールド(列)の数です。 $(NF-1)最後から2番目のフィールドの値です。


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.