sed 命令或 awk 命令来删除文本

-2 sed awk text-processing

我有这个输入文件:

target_id          length   eff_length  est_counts  tpm
ENST00000583162.1   1066       967       1.69899    1.18376
ENST00000583355.1   891        792       13.8057    11.7445
ENST00000582528.5   5342       5243      21.3223    2.74003
ENST00000497744.1   964         865       0            0
ENST00000482564.1   1856       1757       3.29538    1.26367
ENST00000356654.8   4351        4252      56.2725    8.91668
ENST00000396684.2   4290        4191      0.206617   0.0332162
ENST00000541029.1   855         756       3.14783    2.80537
ENST00000537488.1   899         800       2.37306    1.99857
ENST00000264010.8   3939        3840      354.642    62.2241
ENST00000401394.5   2978        2879       28.362     6.63735
ENST00000566078.1   1627        1528        4.9964    2.2031
ENST00000595290.5   1242        1143         0            0
ENST00000595330.1   692          593          0           0
ENST00000596998.2   588          489          0            0
ENST00000374514.7   1810         1711       53.7113    21.1503
Run Code Online (Sandbox Code Playgroud)

我想.*从第一列中删除:

target_id          length   eff_length  est_counts  tpm
ENST00000583162.   1066       967       1.69899    1.18376
ENST00000583355.   891        792       13.8057    11.7445
ENST00000582528.   5342       5243      21.3223    2.74003
ENST00000497744.   964         865       0            0
ENST00000482564.   1856       1757       3.29538    1.26367
ENST00000356654.   4351        4252      56.2725    8.91668
ENST00000396684.   4290        4191      0.206617   0.0332162
ENST00000541029.   855         756       3.14783    2.80537
ENST00000537488.   899         800       2.37306    1.99857
ENST00000264010.   3939        3840      354.642    62.2241
ENST00000401394.   2978        2879       28.362     6.63735
ENST00000566078.   1627        1528        4.9964    2.2031
ENST00000595290.   1242        1143         0            0
ENST00000595330.   692          593          0           0
ENST00000596998.   588          489          0            0
ENST00000374514.   1810         1711       53.7113    21.1503
Run Code Online (Sandbox Code Playgroud)

请告诉我可以使用什么 sed 或 awk 命令来解决此问题。

ter*_*don 7

最简单的方法是删除.每一行第一个之后的所有数字:

$ sed 's/\.[0-9]*/\./' file
target_id          length   eff_length  est_counts  tpm
ENST00000583162.   1066       967       1.69899    1.18376
ENST00000583355.   891        792       13.8057    11.7445
ENST00000582528.   5342       5243      21.3223    2.74003
ENST00000497744.   964         865       0            0
ENST00000482564.   1856       1757       3.29538    1.26367
ENST00000356654.   4351        4252      56.2725    8.91668
ENST00000396684.   4290        4191      0.206617   0.0332162
ENST00000541029.   855         756       3.14783    2.80537
ENST00000537488.   899         800       2.37306    1.99857
ENST00000264010.   3939        3840      354.642    62.2241
ENST00000401394.   2978        2879       28.362     6.63735
ENST00000566078.   1627        1528        4.9964    2.2031
ENST00000595290.   1242        1143         0            0
ENST00000595330.   692          593          0           0
ENST00000596998.   588          489          0            0
ENST00000374514.   1810         1711       53.7113    21.1503
Run Code Online (Sandbox Code Playgroud)

这将找到该.行中的第一个.并将其后的任何数字替换为.. 但是,鉴于这些是成绩单 ID,您可能不想要它们.,因此请尝试以下操作:

$ sed 's/\.[0-9]*//' file
target_id          length   eff_length  est_counts  tpm
ENST00000583162   1066       967       1.69899    1.18376
ENST00000583355   891        792       13.8057    11.7445
ENST00000582528   5342       5243      21.3223    2.74003
ENST00000497744   964         865       0            0
ENST00000482564   1856       1757       3.29538    1.26367
ENST00000356654   4351        4252      56.2725    8.91668
ENST00000396684   4290        4191      0.206617   0.0332162
ENST00000541029   855         756       3.14783    2.80537
ENST00000537488   899         800       2.37306    1.99857
ENST00000264010   3939        3840      354.642    62.2241
ENST00000401394   2978        2879       28.362     6.63735
ENST00000566078   1627        1528        4.9964    2.2031
ENST00000595290   1242        1143         0            0
ENST00000595330   692          593          0           0
ENST00000596998   588          489          0            0
ENST00000374514   1810         1711       53.7113    21.1503
Run Code Online (Sandbox Code Playgroud)

如果您可以在没有 a 的第一列中有一个值.,那么这些命令将更改下一个可用列,并带有.后跟数字。要明确限制为第一列,您可以使用以下其中一个:

  1. awk

    awk -v OFS='\t' '{sub(/\.[0-9]*/,"",$1)}1' file
    
    Run Code Online (Sandbox Code Playgroud)

    或者,留下尾随.

    awk -v OFS='\t' '{sub(/\.[0-9]*/,".",$1)}1' file
    
    Run Code Online (Sandbox Code Playgroud)
  2. GNU sed

    sed -E 's/^(\S+)\.[0-9]*/\1/' file
    
    Run Code Online (Sandbox Code Playgroud)

    或者,留下尾随.

    sed -E 's/^(\S+)\.[0-9]*/\1./' file
    
    Run Code Online (Sandbox Code Playgroud)

    大多数其他 sed 实现:

    sed -E 's/^([^[:blank:]]*)\.[0-9]*/\1/' file
    
    Run Code Online (Sandbox Code Playgroud)

    任何 sed:

    sed 's/^\([^[:blank:]]*\)\.[0-9]*/\1/' file
    
    Run Code Online (Sandbox Code Playgroud)
  3. 珀尔

    perl -pe 's/^(\S+)\.\d+/\1/' file
    
    Run Code Online (Sandbox Code Playgroud)

    或者,留下尾随.

    perl -pe 's/^(\S+)\.\d+/\1./' file
    
    Run Code Online (Sandbox Code Playgroud)