首页 > 解决方案 > 在 bash 中使用正则表达式进行就地解析

问题描述

我想解析第 4 列中的字符串,并在删除不需要的字符时重写同一列中的结果。

我有一个如下所示的文本文件:

Y   12914512    12914512    C/0.214286  A
Y   12914721    12914721    C/0.642857  T
Y   13355944    13355944    A/0.642857  G
Y   13414871    13414871    C/0.642857  T
Y   13470103    13470103    G/0.214286  A
Y   13479657    13479657    G/0.642857  C
Y   14824110    14824110    T/0.933333  *
Y   14824111    14824111    A/0.933333  *
Y   14840785    14840785    C/0.690476  T
Y   14840887    14840887    C/0.933333  T
Y   19705901    19705901    A/0.272727  G
Y   19731995    19731995    A/0.928571  C
Y   19735493    19735493    T/0.928571  C
Y   20587967    20587967    A/0.642857  C
Y   20756691    20756691    C/0.642857  T
Y   21904151    21904151    G/0.9375    A

我想删除第四列中“/”之后的所有尾随字符,并将其替换为第五列中的值,因此我修改后的文本如下所示:

Y   12840422    12840422    G/A
Y   12914512    12914512    C/A
Y   12914721    12914721    C/T
Y   13355944    13355944    A/G

我想出了下面的代码,但它没有产生我期望的结果:

awk -F ":" '{print $1"/"$2}' myTEXT.txt | sed 's/\([^/]*\)\{4\}$//'

标签: awksed

解决方案


另一个(打高尔夫球)awk

$ awk '{k=$NF;sub("/.*","/"k)}1' file

Y   12914512    12914512    C/A
Y   12914721    12914721    C/T
Y   13355944    13355944    A/G
Y   13414871    13414871    C/T
Y   13470103    13470103    G/A
Y   13479657    13479657    G/C
Y   14824110    14824110    T/*
Y   14824111    14824111    A/*
Y   14840785    14840785    C/T
Y   14840887    14840887    C/T
Y   19705901    19705901    A/G
Y   19731995    19731995    A/C
Y   19735493    19735493    T/C
Y   20587967    20587967    A/C
Y   20756691    20756691    C/T
Y   21904151    21904151    G/A

可能更容易sed

$ sed -E 's /.*(.) /\1 ' file

推荐阅读