简短的

简短的

我有一个看起来像这样的文件:

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}}}'

但是,如何编辑它以打印第一列?

答案1

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"}当然可以结合。

答案2

假设该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

NFawk是将每个记录(行)分割成的 字段(列)数。$(NF-1)是倒数第二个字段的值。

答案3

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]

相关内容