sed或awk-删除模式之间的字符串

sed或awk-删除模式之间的字符串,sed,awk,replace,Sed,Awk,Replace,我有一个CSV文件,其中的行如下: AAA,A-name,num1,num2,num3 BBB,B-name,num1,num2,num3 CCC.DDD,C-name,num1,num2,num3 EEE.FFF.GGGG,E-name,num1,num2,num3 HHH.H-name,num1,num2,num3 ... 有些行有一个标识符(如AAA);有些有两个(如CCC);有些有三个或更多(如EEE)。有些标识符不是三个字符。我需要从该行的每一行中删除除第一个标识符以外的所有

我有一个CSV文件,其中的行如下:

AAA,A-name,num1,num2,num3
BBB,B-name,num1,num2,num3
CCC.DDD,C-name,num1,num2,num3
EEE.FFF.GGGG,E-name,num1,num2,num3    
HHH.H-name,num1,num2,num3
...
有些行有一个标识符(如AAA);有些有两个(如CCC);有些有三个或更多(如EEE)。有些标识符不是三个字符。我需要从该行的每一行中删除除第一个标识符以外的所有标识符(这样,第一个句点和它后面的任何内容都会被删除,直到遇到第一个逗号),从而产生以下结果:

AAA,A-name,num1,num2,num3
BBB,B-name,num1,num2,num3
CCC,C-name,num1,num2,num3
EEE,E-name,num1,num2,num3
HHH,H-name,num1,num2,num3
...
我尝试了一些模式替换方法,但我被绊倒了。有人有我需要的语法吗?

使用perl

sed 's/^\([^.]\{1,\}\)[^,]*/\1/'
$ perl -pe 's/\.[A-Z.]*?,/,/' input
AAA,A-name,num1,num2,num3
BBB,B-name,num1,num2,num3
CCC,C-name,num1,num2,num3
EEE,E-name,num1,num2,num3
HHH.H-name,num1,num2,num3
塞德

还有啊

$ awk '/\./{sub(/\.[A-Z.]*,/, ",", $0)}{print}' input
AAA,A-name,num1,num2,num3
BBB,B-name,num1,num2,num3
CCC,C-name,num1,num2,num3
EEE,E-name,num1,num2,num3
HHH.H-name,num1,num2,num3

只需删除点和第一个冒号之间的所有内容。档案

$ cat foo
AAA,A-name,num1,num2,num3
BBB,B-name,num1,num2,num3
CCC.DDD,C-name,num1,num2,num3
EEE.FFF.GGGG,E-name,num1,num2,num3    
HHH.H-name,num1,num2,num3
使用此sed命令:

$ sed 's/\.[^,]*//' foo
AAA,A-name,num1,num2,num3
BBB,B-name,num1,num2,num3
CCC,C-name,num1,num2,num3
EEE,E-name,num1,num2,num3    
HHH,num1,num2,num3

但是,它将删除最后一行的
H
。然而,在您的示例中,这似乎是一个输入错误。

我认为您的HHH行有问题。第一个句点不应该是逗号吗?“三个或更多”不应该指EEE而不是HHH吗?如果只有一个标识符并且名称字段中出现句点,那么这些可能会有问题。但是,如果标识符字段中只显示句点,则效果良好且清晰。
$ sed 's/\.[^,]*//' foo
AAA,A-name,num1,num2,num3
BBB,B-name,num1,num2,num3
CCC,C-name,num1,num2,num3
EEE,E-name,num1,num2,num3    
HHH,num1,num2,num3