使用 sed 捕获组

ale*_*lex 2 sed bioinformatics

我有一个看起来像这样的文件:

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
Run Code Online (Sandbox Code Playgroud)

我正在编写 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

Kus*_*nda 5

您的命令将丢弃不包含|字符的行以及鼠标基因标识符没有版本号的行。sed -n我不确定这是有意的,但这是与p标记一起使用的副作用s。我假设这是无意的。

只需使用两个表达式sed

sed -e 's/.*|//' -e 's/\..*//' file >newfile
Run Code Online (Sandbox Code Playgroud)

使用grep具有非标准-o选项的命令,并假设您只想从文件中提取所有 Ensembl 小鼠基因稳定 ID(并且该文件仅包含您想要提取的稳定 ID),

grep -o 'ENSMUSG[[:digit:]]*' file >newfile
Run Code Online (Sandbox Code Playgroud)

您还可以使用两个链接cut命令,每个命令都会对数据进行与sed本答案前面的两个替换类似的修改。使用静态剪切可能比使用正则表达式更快,但我怀疑除非您的输入数据很大,否则您不会看到任何重大的速度差异。

cut -d '|' -f 2 file | cut -d '.' -f 1 >newfile
Run Code Online (Sandbox Code Playgroud)