我有这样的数据:
chr1 134901 139379 - "ENSG00000237683.5";
chr1 860260 879955 + "ENSG00000187634.6";
chr1 861264 866445 - "ENSG00000268179.1";
chr1 879584 894689 - "ENSG00000188976.6";
chr1 895967 901095 + "ENSG00000187961.9";
我通过解析 GTF 文件生成
如果可能的话,我想使用 awk 或 sed 删除第 5 列中的 和"
。;
结果如下:
chr1 134901 139379 - ENSG00000237683.5
chr1 860260 879955 + ENSG00000187634.6
chr1 861264 866445 - ENSG00000268179.1
chr1 879584 894689 - ENSG00000188976.6
chr1 895967 901095 + ENSG00000187961.9
答案1
使用gsub
:
awk '{gsub(/\"|\;/,"")}1' file
chr1 134901 139379 - ENSG00000237683.5
chr1 860260 879955 + ENSG00000187634.6
chr1 861264 866445 - ENSG00000268179.1
chr1 879584 894689 - ENSG00000188976.6
chr1 895967 901095 + ENSG00000187961.9
如果你想经营仅有的在第五个字段上并保留其他字段中的所有引号或分号:
awk '{gsub(/\"|\;/,"",$5)}1' file
答案2
如果您的数据格式完全如图所示(即没有其他"
或;
在其他列中需要保留),那么您可以简单地使用tr
删除这些字符:
tr -d '";' < input.txt > output.txt
答案3
使用 sed 删除 '";' 的所有实例:
sed -i 's/[";]//g' file
仅从第五列中删除 sed 可能不是最好的选择。
答案4
一个 sed 解决方案,确保我们只摆弄第五列:
sed -E 's/^(([^ ]+ +){4})"([^"]+)";$/\1\3/' infile
chr1 134901 139379 - ENSG00000237683.5
chr1 860260 879955 + ENSG00000187634.6
chr1 861264 866445 - ENSG00000268179.1
chr1 879584 894689 - ENSG00000188976.6
chr1 895967 901095 + ENSG00000187961.9
这在没有 ERE(-E
或-r
某些较旧的 sed)的情况下也可以工作,但需要更多的反斜杠。+
根据 POSIX 规范1, -量词仅是 ERE ,并且可以替换为{1,}
(或\{1,\}
用于 BRE)。
如果列不是用空格分隔的,则可以用 POSIX 字符类替换空格[:blank:]
以也匹配制表符。
正则表达式详细信息:
^ # Anchored at start of line
( # Capture group 1 for first 4 columns
( # Capture group 2 for repeat count
[^ ]+ # 1 or more non-spaces
+ # 1 or more spaces
){4} # 4 times "word plus spaces" (columns)
) # End capture group 1
" # Column 5 starts with double quote (not captured)
( # Capture group 3 for column 5
[^"]+ # One or more non-quote characters
) # End capture group 3
"; # Quote and semicolon at end of column 5
$ # Anchored at end of line
1 GNU sed 作为扩展,\+
也允许在 BRE 中使用。