在bash中使用正则表达式进行就地解析

时间:2019-05-22 20:41:57

标签: awk sed

我想解析第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\}$//'

3 个答案:

答案 0 :(得分:3)

另一个(打高尔夫球的)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

答案 1 :(得分:2)

使用GNU sed进行“就地”编辑和\s速记:

sed -i 's:/.*\s:/:' file

或与GNU awk相同:

awk -i inplace '{sub(/\/.*\s/,"/")}1' file

无论哪种情况,输入文件都将变为:

$ cat 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

答案 2 :(得分:1)

您可以使用

awk '{sub(/[^\/]*$/, "", $4); print $1,$2,$3,$4$5}' file > newfile

请参见awk demo online

详细信息

  • sub(/[^\/]*$/, "", $4)删除字段4末尾除/以外的所有字符
  • print $1,$2,$3,$4$5打印字段1、2、3,然后将字段4和字段5的剩余内容串联起来。