如何用awk修改文本字段?

我想删除第一个冒号后面的文本:包括),或者用什么都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 .