2011-06-16 61 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。但是,這似乎是您示例中的拼寫錯誤。