2016-06-09 49 views
0

我有大的逗號分隔的文件,20000行和5列,我想提取特定的列,但有更多的值,所以更多的逗號,除了標題,所以如何剪切柱。在CSV文件中打印第一個,倒數第二個和最後一個字段

示例文件:

name,v1,v2,v3,v4,v5 
as,"10,12,15",21,"12,11,10,12",5,7 
bs,"11,15,16",24,"19,15,18,23",9,3 

這是我想要的輸出:

name,v4,v5 
as,5,7 
bs,9,3 

我嘗試下列剪切命令,但不起作用

cut -d, -f1,5,6 
+0

20000並不大。在二十多年前,我已經不會考慮將它彈出到文本編輯器中,並且在它上面進行搜索替換。 – Kaz

+0

據我統計,你的文件有六個字段:名字和v1到v5。 – Kaz

回答

1

一般情況下,這些方案最好使用適當的csv解析器。例如,你可以在Python中找到它們。

然而,由於你的數據似乎也只有在最開始的逗號領域,你可以決定要打印的第一個字段,然後倒數第二個和最後一個:

$ awk 'BEGIN{FS=OFS=","} {print $1, $(NF-1), $NF}' file 
name,v4,v5 
as,5,7 
bs,9,3 
+0

謝謝fedorqui,但如果我想削減中心collum(即第3),那麼什麼? – mona

+0

@mona然後你必須使用CSV解析器,因爲bash腳本編寫不能很好地處理它。 – fedorqui

0

TXR Lisp語言:

$ txr extract.tl < data 
name,v4,v5 
as,5,7 
bs,9,3

守則extract.tl

(mapdo 
    (lambda (line) 
    (let ((f (tok-str line #/"[^"]*"|[^,]+/))) 
     (put-line `@[f 0],@[f 4],@[f 5]`))) 
    (get-lines)) 

作爲濃縮的一個班輪:

$ txr -t '(mapcar* (do let ((f (tok-str @1 #/"[^"]*"|[^,]+/))) 
        `@[f 0],@[f 4],@[f 5]`) (get-lines))' < data
相關問題