指定列中的 awk sub
awk sub in specified column
我试图删除不同定界符前后的文本,仅在特定列中,第 3 列。
第一个分隔符是分号,第二个是逗号。它们也存在于未显示的列中。
输入数据:
chr2L 54273 2L_54273_SNP;rs203207895 A G 999 PASS ALTCOUNT=118;DB;REFCOUNT=69 GT ./. ./. 0/0
chr2L 54339 2L_54339_SNP;rs206877787,rs80377533 T A 999 PASS ALTCOUNT=114;DB;REFCOUNT=73 GT ./. ./.
chr2L 54587 2L_54587_SNP;rs203534836 A G 999 PASS ALTCOUNT=5;DB;REFCOUNT=199 GT 0/0 0/0 0/0
要求输出:
chr2L 54273 rs203207895 A G 999 PASS ALTCOUNT=118;DB;REFCOUNT=69 GT ./. ./. 0/0
chr2L 54339 rs206877787 T A 999 PASS ALTCOUNT=114;DB;REFCOUNT=73 GT ./. ./.
chr2L 54587 rs203534836 A G 999 PASS ALTCOUNT=5;DB;REFCOUNT=199 GT 0/0 0/0 0/0
我的努力主要集中在删除分号之前(包括分号)的文本,但没有取得显着效果:
awk '{ if ( == ".*\;//") { = ""; print} else { print }; }' < a > b
sed 's/.*;//' a > b
awk '{ sub(/*.;/,"",) }1 ' < a > b
awk '{sub(;/./*,""); print}' < a > b
我认为你可以使用这样的东西:
awk '{ gsub(/^.*;|,.*$/, "", ) }1' file
这匹配从第三个字段开始到分号或从逗号到字段结尾的任何内容,并将它们替换为空字符串。
您的问题之一是您使用的是 *.
(语法不正确)而不是 .*
(任意字符的零个或多个)。
如评论中所建议(谢谢),您可能希望使模式稍微严格一些,例如:
/^[^;]*;|,[^,]*$/
这只会匹配从开始到第一个 ;
以及从最后一个 ,
到结尾。如果您确定您的数据始终只有一个 ;
和一个 ,
,这不是必需的,但需要注意。
如果您的输入是制表符分隔的,那么您可以通过指示 awk 来保留空格:
awk 'BEGIN { FS = OFS = "\t" } { gsub(/^.*;|,.*$/, "", ) } 1' file
FS
和OFS
是用来设置输入输出字段分隔符的变量。
我试图删除不同定界符前后的文本,仅在特定列中,第 3 列。
第一个分隔符是分号,第二个是逗号。它们也存在于未显示的列中。
输入数据:
chr2L 54273 2L_54273_SNP;rs203207895 A G 999 PASS ALTCOUNT=118;DB;REFCOUNT=69 GT ./. ./. 0/0
chr2L 54339 2L_54339_SNP;rs206877787,rs80377533 T A 999 PASS ALTCOUNT=114;DB;REFCOUNT=73 GT ./. ./.
chr2L 54587 2L_54587_SNP;rs203534836 A G 999 PASS ALTCOUNT=5;DB;REFCOUNT=199 GT 0/0 0/0 0/0
要求输出:
chr2L 54273 rs203207895 A G 999 PASS ALTCOUNT=118;DB;REFCOUNT=69 GT ./. ./. 0/0
chr2L 54339 rs206877787 T A 999 PASS ALTCOUNT=114;DB;REFCOUNT=73 GT ./. ./.
chr2L 54587 rs203534836 A G 999 PASS ALTCOUNT=5;DB;REFCOUNT=199 GT 0/0 0/0 0/0
我的努力主要集中在删除分号之前(包括分号)的文本,但没有取得显着效果:
awk '{ if ( == ".*\;//") { = ""; print} else { print }; }' < a > b
sed 's/.*;//' a > b
awk '{ sub(/*.;/,"",) }1 ' < a > b
awk '{sub(;/./*,""); print}' < a > b
我认为你可以使用这样的东西:
awk '{ gsub(/^.*;|,.*$/, "", ) }1' file
这匹配从第三个字段开始到分号或从逗号到字段结尾的任何内容,并将它们替换为空字符串。
您的问题之一是您使用的是 *.
(语法不正确)而不是 .*
(任意字符的零个或多个)。
如评论中所建议(谢谢),您可能希望使模式稍微严格一些,例如:
/^[^;]*;|,[^,]*$/
这只会匹配从开始到第一个 ;
以及从最后一个 ,
到结尾。如果您确定您的数据始终只有一个 ;
和一个 ,
,这不是必需的,但需要注意。
如果您的输入是制表符分隔的,那么您可以通过指示 awk 来保留空格:
awk 'BEGIN { FS = OFS = "\t" } { gsub(/^.*;|,.*$/, "", ) } 1' file
FS
和OFS
是用来设置输入输出字段分隔符的变量。