我想删除第一个冒号后面的文本:
包括),或者用什么都replace掉。
例如, 1:5:30
应该变成1
。 我更喜欢awk脚本来执行这个工作。 但我不知道该怎么做。 你能给我任何指示吗? 提前致谢。
我的数据是制表符分隔的,文件看起来像是在某些单元格中有点。
1 313 . TC 30.11 1:5:30 . . . 1 316 . AT 30.80 1:5:30 . 0:8:28 . 1 317 . TA 31.40 1:5:36 . 0:8:28 .
我尝试了以下,但我失败了所有的人:
sed 's/:*:*//g' mydatafile sed 's/:[0-9]:[0-9]//g' mydatafile
位不清楚期望的输出应该是什么,但这是我的解释,使用sed
:
$ sed 's/:.*//' input 1 313 . TC 30.11 1 1 316 . AT 30.80 1 1 317 . TA 31.40 1
使用awk:
$ awk -F":" '{print $1}' input 1 313 . TC 30.11 1 1 316 . AT 30.80 1 1 317 . TA 31.40 1
使用剪切:
cut -d":" -f1 input
使用bash:
IFS=':' while read ab; do echo $a done < input
使用awk的替代解释:
$ awk 'BEGIN {OFS="\t"} {sub(/:.*/,"",$7); print}' input 1 313 . TC 30.11 1 . . . 1 316 . AT 30.80 1 . 0:8:28 . 1 317 . TA 31.40 1 . 0:8:28 .
第三,希望最后更新
使用awk进行第三种解释:
$ awk 'BEGIN {OFS="\t"} {for (i=1;i<NF;i++){sub(/:.*/,"",$i)}; print}' input 1 313 . TC 30.11 1 . . . 1 316 . AT 30.80 1 . 0 . 1 317 . TA 31.40 1 . 0 .
perl -p -e 's/:\d+:\d+//g' mydatafile
尝试这个:
sed 's/\([0-9][0-9]*\):[0-9][0-9]*:[0-9][0-9]*/\1/g' infile
要么
sed 's/\([0-9]\{1,\}\):[0-9]\{1,\}:[0-9]\{1,\}/\1/g' infile
输出 :
1 313 . TC 30.11 1 . . . 1 316 . AT 30.80 1 . 0 . 1 317 . TA 31.40 1 . 0 .
这是使用sed
的最短的一个:
sed -i.orig 's/\([0-9]\)*:[^ ]*/\1/g' inputfile
这将原始文件的副本保存为inputfile.orig
。 并在原地替换文件。
这应该做的伎俩。
$ sed -e 's/:.*//' mydatafile 1 313 . TC 30.11 1 1 316 . AT 30.80 1 1 317 . TA 31.40 1
我认为sed比awk对这个问题要容易一些。
正则表达式语法概述
后来 。 。
我从你的意见看到其他答案,你想用x:y:z
来替换每个 x:y:z
出现。 在这种情况下,我会使用这个awk程序。
$ cat test.awk BEGIN { FS = "\t"; } { for (i = 1; i <= NF; i++) { if (match($i, /:.*/)) { $i = substr($i, 1, RSTART - 1); } printf("%s\t", $i); } printf("\n"); } $ awk -f test.awk test.dat 1 313 . TC 30.11 1 . . . 1 316 . AT 30.80 1 . 0 . 1 317 . TA 31.40 1 . 0 .