根据先前的字符串提取文件中每行的特定部分

时间:2018-01-21 20:17:29

标签: parsing awk

我有一个文件,其中的行如下:

intergenic  NONE(dist=NONE),ENSG00000223972(dist=1692)  1   10177   10177   -   C   1   10177   rs367896724 A   AC  100 PASS    AC=2130;AF=0.425319;AN=5008;NS=2504;DP=103152;EAS_AF=0.3363;AMR_AF=0.3602;AFR_AF=0.4909;EUR_AF=0.4056;SAS_AF=0.4949;AA=|||unknown(NO_COVERAGE);VT=INDEL

我想要做的是使用开始和结束字符提取我需要的部分。所以我想提取AFR_AF的值。我所知道的是,此值以AFR_AF开头,以;结尾(整个内容如下:AFR_AF=0.4909;所以我想要0.4909

如果可能的话,我想提取每一行的多个部分。这可能是使用像awk这样的东西吗?

2 个答案:

答案 0 :(得分:1)

oP的grep应该会有所帮助:

grep -oP 'AFR_AF=\K[^;]*` file

或者您希望在一个短片中使用多个值,例如:

grep -oP '(AFR_AF=|VT=)\K[^;]*' file

将给出

0.4909
INDEL

答案 1 :(得分:1)

awk的便携式解决方案:

# extract.awk
BEGIN {
    FS="="
    RS=";"
    search["AFR_AF"]=1
    # Add more items as you wish
    search["FOO_BAR"]=1
    search["HELLO_WORLD"]=1
}

$1 in search {
    print $2
}

像这样运行:

awk -f extract.awk input.file

<强>解释

使用;作为记录分隔符(RSawk会看到这样的记录(而不是逐行):

foo=bar
hello=world
no equal sign in this record
...

由于我们将字段分隔符(FS设置为=,我们可以检查第一个字段$1是否包含特定值并打印该值在这种情况下$2

搜索本身已使用关联数组实现。 $1 in search检查$1是否是该数组的键。