我有一个包含以下行的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
...
我尝试了一些模式替换方法但是我被绊倒了。有没有人有我需要的语法?
答案 0 :(得分:2)
sed 's/^\([^.]\{1,\}\)[^,]*/\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
。然而,这似乎是你的例子中的一个错字。
答案 2 :(得分: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