2011-06-16 60 views
2

我有一个CSV像这样行文件:SED或AWK - 图案之间删除字符串

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 
... 

我已经尝试了一些模式替换方法,但是被绊倒了。有没有人有我需要的语法?

+1

我认为你的HHH线有问题。第一段不应该是逗号吗? “三个或更多”不应该指EEE而不是HHH? – 2011-06-16 13:41:57

回答

1

使用perl

$ 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 

sed的

$ sed '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

$ 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 
+0

如果只有一个标识符并且在名称字段中出现句点,则这些可能会有问题。尽管如此,如果只有句点出现在标识符字段中,那么很好并且很清楚。 – 2011-06-16 13:50:20

2
sed 's/^\([^.]\{1,\}\)[^,]*/\1/' 
2

只是删除一个点和第一个冒号之间的一切。对于文件

$ 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。但是,这似乎是您示例中的拼写错误。