2016-07-11 19 views
0

它們排序我有對該格式的每一行4個字段巨大csv文件(ID1,ID2,得分,ELEM):合併csv文件的行具有相同的初始場,並通過它們的長度

HELLO,世界,2323,elem1

GOODBYE,BLUESKY,3232,elem2時

HELLO WORLD, 421,elem3

GOODBYE,BLUESKY,41134,elem4

ETC ...

我想合併具有相同的ID1每一行,在同一行消除了得分字段ID2領域,從而導致:

HELLO WORLD, elem1,elem3 .....

GOODBYE,藍天, elem2時,elem4 .....

ETC ...

其中每個ELEM來自不同的線使用相同的ID1,ID2。 之後,我想根據它們的長度對行進行排序。

我試圖在java中編碼,但是是superslow。我已經在線閱讀了關於AWK的內容,但是我無法真正找到一個能夠理解它的csv文件語法的好地方。 我使用了這個命令,我該如何適應我的需求?

awk -F',' 'NF>1{a[$1] = a[$1]","$2}END{for(i in a){print i""a[i]}}' finale.txt > finale2.txt^C 
+0

更改'$ 2'爲'$ 4',那應該這樣做。 – jas

+0

我也想匹配第二個字段,這是額外條件的語法,如[$ 1] = a [$ 1]? – Aalto

回答

1

你的鑰匙應該是合成的,還需要設置逗號和空格的分隔符。

$ awk -F', *' -v OFS=', ' '{k=$1 OFS $2; a[k]=k in a?a[k] OFS $4:$4} 
         END{for(k in a) print k, a[k]}' file 

GOODBYE, BLUESKY, elem2, elem4 
HELLO, WORLD, elem1, elem3 

說明

組字段分隔符(FS),以逗號,接着與一個或多個空格,和輸出字段分隔符(OFS),以歸一化形式(逗號和一個空間)。從用OFS隔開的前兩個字段創建組合鍵(因爲我們將在輸出中使用它)。將第四個字段附加到按鍵索引的數組元素(因爲我們不想以OFS開頭,所以請首先處理第一個元素)。當所有記錄完成(END塊)時,打印所有的鍵和值。

要添加長度保持一個並行計數器,並且每次爲每個鍵附加c[k]++時增加並在打印時使用它。也就是,

$ awk -F', *' -v OFS=', ' '{k=$1 OFS $2; c[k]++; a[k]=k in a?a[k] OFS $4:$4} 
         END{for(k in a) print k, c[k], a[k]}' file | 
    sort -t, -k3n 

GOODBYE, BLUESKY, 2, elem2, elem4 
HELLO, WORLD, 2, elem1, elem3 
+0

非常感謝您的時間,我可以問您解決方案的語法解釋嗎? – Aalto

+0

問題是,我想以第三個字段的形式添加該特定行(ID1,ID2,length,elem1,elem2,...)的元素數量,以便使用該字段的文件行。 – Aalto

相關問題