linux用sed删除了reg表达模式

时间:2016-08-30 07:34:34

标签: regex linux bash sed

我有一个文本文件,我想删除冒号之前的字符串。

txt文件:

jhu-usc.edu_.450.1.lvl-3.TA-LK-A4NW-01A-11D-A34E-05.txt:05556808    0.916496542
jhu-usc.edu_.450.1.lvl-3.TA-LK-A4NW-01A-11D-A34E-05.txt:08883127    0.891518088
jhu-usc.edu_.450.1.lvl-3.TA-LK-A4NW-01A-11D-A34E-05.txt:10537079    0.827900035
jhu-usc.edu_.450.1.lvl-3.TA-LK-A4NW-01A-11D-A34E-05.txt:12497728    0.90517593
jhu-usc.edu_.450.1.lvl-3.TA-LK-A4NW-01A-11D-A34E-05.txt:13195463    NA
jhu-usc.edu_.450.1.lvl-3.TA-LK-A4NW-01A-11D-A34E-05.txt:22240159    0.809459655
jhu-usc.edu_.450.1.lvl-3.TA-LK-A4NW-01A-11D-A34E-05.txt:27050343    NA
jhu-usc.edu_.450.1.lvl-3.TA-LK-A4NY-01A-11D-A34E-05.txt:05556808    0.816581048
jhu-usc.edu_.450.1.lvl-3.TA-LK-A4NY-01A-11D-A34E-05.txt:08883127    0.864387435
jhu-usc.edu_.450.1.lvl-3.TA-LK-A4NY-01A-11D-A34E-05.txt:10537079    0.565236625

期望的输出:

5556808 0.916496542
8883127 0.891518088
10537079    0.827900035
12497728    0.90517593
13195463    NA
22240159    0.809459655
27050343    NA
5556808 0.816581048
8883127 0.864387435
10537079    0.565236625

我尝试了sed 's/\.[^:]*$//' file,但没有工作。

6 个答案:

答案 0 :(得分:2)

  • sed

    sed 's/^[^:]*://' file.txt
    
  • grep

    grep -o '[^:]*$' file.txt
    
  • awk

    awk -F: '{print $2}' file.txt
    

答案 1 :(得分:2)

您需要匹配最后一个:并删除该部分:

sed 's/^.*://' file

请参阅online demo

模式详情

  • ^ - 行首
  • .* - 尽可能多的任何字符(这意味着到最后......)
  • : - 冒号。

答案 2 :(得分:1)

试试这个,这里“:”设置为字段的分隔符,NF代表最后一个字段。 sub用于从最后一个字段中删除前导零。(根据您所需的o / p)。但是,如果您不希望删除前导零,则只需从命令下方删除sub(/^0/,"")

awk -F: '{$0=$NF;sub(/^0/,"")}1' infile
5556808    0.916496542
8883127    0.891518088
10537079    0.827900035
12497728    0.90517593
13195463    NA
22240159    0.809459655
27050343    NA
5556808    0.816581048
8883127    0.864387435
10537079    0.565236625

答案 3 :(得分:1)

cat file | cut -f2- -d:

做你需要的。

它处理输入的每一行,并使用-f作为分隔符从第二个字段开始直到行的末尾(2-)提取所有字段(:) (-d)。

详细了解cut

答案 4 :(得分:1)

不多说。使用冒号作为字段分隔符,我们只有2列可以处理。 首先开始通过sub删除前导零,然后打印第二列。

awk -F: '{sub(/^0/,"",$2);print $2}' file

    5556808    0.916496542
    8883127    0.891518088
    10537079    0.827900035
    12497728    0.90517593
    13195463    NA
    22240159    0.809459655
    27050343    NA
    5556808    0.816581048
    8883127    0.864387435
    10537079    0.565236625

答案 5 :(得分:1)

无需执行任何子删除前导零。我们可以使用正则表达式作为awk字段分隔符。

awk -F":(0+)?" '{print $2;}' <filename>