Sed

使用 sed 擷取組

  • October 21, 2021

我有一個看起來像這樣的文件:

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

sed -e 's/.*|//' -e 's/\..*//' file >newfile

使用grep具有非標準-o選項的命令,並假設您只想從文件中提取所有 Ensembl 小鼠基因穩定 ID(並且該文件僅包含您要提取的穩定 ID),

grep -o 'ENSMUSG[[:digit:]]*' file >newfile

您還可以使用兩個鍊式cut命令,每個命令都對數據進行類似的修改,就像sed本答案前面的兩個替換一樣。使用靜態剪切可能比使用正則表達式更快,但我懷疑你會看到任何主要的速度差異,除非你的輸入數據很大。

cut -d '|' -f 2 file | cut -d '.' -f 1 >newfile

引用自:https://unix.stackexchange.com/questions/673982