2013-03-08 60 views
0

假設我們有以下記錄{(XXX1),(XXX2)},whatever我想要的是,根據以下規則提取信息,最好使用'grep':if {} contains less或者等於兩個UNIQUE元素,()中的那些元素,然後保留它們,否則刪除整行。作爲進一步的步驟中,我想內的()中提取的值,最後寫爲如下形式的剩餘行:XXX1,XXX2,whatever如何使用'grep'命令清除CSV文件

UPDATE:

對於以下輸入:

{(XXX1),(XXX2)},whatever,unique=2 
{(XXX1),(XXX1),(XXX1),(XXX2)},whatever,unique=2 
{(XXX1)},whatever,unique=1 
{},whatever,unique=0 
{(XXX1),(XXX2),(XXX3),(XXX4)},whatever 

我應該得到的輸出如下:

XXX1,XXX2,whatever,unique=2 
XXX1,whatever,unique=1 
+0

您不能(可靠地)使用grep處理csv數據,因爲cvs條目可以跨越多行。即使你沒有其中的任何一個,grep可能不會決定某個給定的逗號(或任何分隔符是否)在一個條目中或將它們分開。 – 2013-03-08 14:59:27

+0

很好,謝謝!那麼,你會推薦我什麼? – user706838 2013-03-08 15:03:57

+0

有http://www.aboutwilson.net/csvgrep/,但我沒有看到它可以做什麼,不能做什麼。除此之外,使用一些適當的CSV解析器和寫入器/串行器,並在其上實現邏輯。就個人而言,我會檢查紅寶石,但語言的選擇可能取決於你所知道的。 – 2013-03-08 15:08:04

回答

1

awk中能做到這一點,看看這個單行R:

awk -F'[}{]' '{split($2,a,",");delete(b);for(x in a)b[a[x]]}length(b)<=2' file 

讓我們做一個小測試:

kent$ cat file 
ok,{(XXX1),(XXX2)},whatever,unique=2 
ok,{(XXX1),(XXX1),(XXX1),(XXX2)},whatever,unique=2 
ok,{(XXX1)},whatever,unique=1 
ok,{},whatever,unique=0 
nok,{(XXX1),(XXX2),(XXX3),(XXX4)},whatever 

kent$ awk -F'[}{]' '{split($2,a,",");delete(b);for(x in a)b[a[x]]}length(b)<=2' file 
ok,{(XXX1),(XXX2)},whatever,unique=2 
ok,{(XXX1),(XXX1),(XXX1),(XXX2)},whatever,unique=2 
ok,{(XXX1)},whatever,unique=1 
ok,{},whatever,unique=0 

你可以看到,nok線取出

編輯

awk -F'[}{]' '{gsub(/[()]/,"");split($2,a,",");delete(b);for(x in a)b[a[x]];l=length(b)}l<=2&&l>0{s="";for(x in b)s=s""x",";sub(/,$/,"",s);y[s]=s $3}END{for(x in y)print y[x]}' file 

測試

kent$ cat file 
{(XXX1),(XXX2)},whatever,unique=2 
{(XXX1),(XXX1),(XXX1),(XXX2)},whatever,unique=2 
{(XXX1)},whatever,unique=1 
{},whatever,unique=0 
{(XXX1),(XXX2),(XXX3),(XXX4)},whatever 

kent$ awk -F'[}{]' '{gsub(/[()]/,"");split($2,a,",");delete(b);for(x in a)b[a[x]];l=length(b)}l<=2&&l>0{s="";for(x in b)s=s""x",";sub(/,$/,"",s);y[s]=s $3}END{for(x in y)print y[x]}' file 
XXX1,XXX2,whatever,unique=2 
XXX1,whatever,unique=1 
+0

謝謝!差不多了!你可以參考我的問題嗎?只需發佈更新。 – user706838 2013-03-08 16:05:09

+0

@eualin爲你做到了。 – Kent 2013-03-08 16:22:38