打印以特定字符串开头的列


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

我通常使用aawk命令来解析文件:

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

有没有简单的方法可以更改此命令以使其在这种情况下工作?

我认为这样可能有效:

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

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

Answers:


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办?
宇宙论者,2016年

@ 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

NFawk将每个记录(行)拆分为的字段(列)的数量。 $(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]

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.