我有一个看起来像这样的文件:
chr1 3143567 3143568 .3-2704 1.000000|ENSMUSG00000102693.2
chr1 3143599 3143600 .3-2705 1.000000|ENSMUSG00000102693.2
chr1 3143631 3143632 .3-2706 1.000000|ENSMUSG00000102693.2
chr1 3143663 3143664 .3-2707 1.000000|ENSMUSG00000102693.2
chr1 3143695 3143696 .3-2708 1.000000|ENSMUSG00000102693.2
chr1 3143727 3143728 .3-2709 1.000000|ENSMUSG00000102693.2
我正在编写 2 个 sed 表达式来过滤|
第一个之前的所有内容,并使用结果文件我丢弃之后的所有内容,.
如下所示:
sed -n -e 's/^.*|//p' original_file.txt > first_result.txt
sed -n -e 's/\..*//p' first_result.txt > final_result.txt
我怎样才能将所有这些写在一行中?
最终目标是捕获ENSMUSG00000102693
您的命令将丢弃不包含
|
字符的行,以及鼠标基因标识符没有版本号的行。我不确定这是有意的,但这是在命令上sed -n
使用p
标志的副作用。s
我会假设这是无意的。只需使用两个表达式
sed
:使用
grep
具有非标准-o
选项的命令,并假设您只想从文件中提取所有 Ensembl 小鼠基因稳定 ID(并且该文件仅包含您要提取的稳定 ID),您还可以使用两个链式
cut
命令,每个命令都对数据进行类似的修改,就像sed
本答案前面的两个替换一样。使用静态剪切可能比使用正则表达式更快,但我怀疑你会看到任何主要的速度差异,除非你的输入数据很大。您可以使用如下的单个
sed
表达式。将所有内容匹配到最后一个|
以忽略,然后捕获最后一个之前的部分.
并将其排除在结果中。在任何支持 POSIX BRE 的 sed 上如果首选 awk,
您可以使用 GNU
grep
(它的性能似乎比 GNU 稍好sed
):(?<=\|)[^|.]+
意思是“查找所有不是 a|
或.
([^|.]+
) 的字符,从(并且不包括)初始|
((?<=\|)
) 开始”。与
sed
:.*|\([^|]\+\)\..*
意思是“删除|
和.
(.*|
,\..*
) 之间的所有字符并捕获 (\([^|]\+\)
) 之间的内容,最后用捕获的模式 ( ) 替换所有字符/\1/
。或者更简洁地说: