打印 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
我有一个用逗号分隔的大文件,有 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