我想解析第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\}$//'
答案 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的剩余内容串联起来。