我正在尝试删除不同分隔符之前和之后的文本,仅在特定列中的第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 ($3 == ".*\;//") {$3 = ""; print} else { print }; }' < a > b
sed 's/.*;//' a > b
awk '{ sub(/*.;/,"",$3) }1 ' < a > b
awk '{sub(;/./*,""); print}' < a > b
答案 0 :(得分:1)
我认为你可以使用这样的东西:
awk '{ gsub(/^.*;|,.*$/, "", $3) }1' file
这匹配从第三个字段的开头到分号或从逗号到字段末尾的任何内容,并用空字符串替换它们。
您的一个问题是您使用的是*.
(语法不正确)而不是.*
(任何字符的零或多个)。
正如评论(谢谢)中所建议的那样,您可能希望使模式稍微严格一些,例如:
/^[^;]*;|,[^,]*$/
从开始到第一个;
以及从最后一个,
到结尾只会匹配。如果您确定自己的数据始终只有一个;
和一个,
,则这不是必需的,但需要注意。
如果您的输入是制表符分隔的,那么您可以通过指示awk来保留空格:
awk 'BEGIN { FS = OFS = "\t" } { gsub(/^.*;|,.*$/, "", $3) } 1' file
FS
和OFS
是用于设置输入和输出字段分隔符的变量。