打印 CSV 文件中的第一个、倒数第二个和最后一个字段

Print first, penultimate and last fields in CSV file

我有一个用逗号分隔的大文件,有 20000 行和五列,我想提取特定的列,但是有更多的值所以更多的逗号,除了 header,那么如何剪切这样的列。

示例文件:

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 命令但不起作用

cut -d, -f1,5,6

一般来说,对于这些场景最好使用合适的 csv 解析器。例如,您可以在 Python 中找到它们。

但是,由于您的数据似乎在一开始就有带逗号的字段,您可以决定打印第一个字段,然后打印倒数第二个和最后一个:

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

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