我有一个看起来像这样的文件:
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
NF
awk
是将每个记录(行)分割成的 字段(列)数。$(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]