代码之家  ›  专栏  ›  技术社区  ›  mona

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

  •  0
  • mona  · 技术社区  · 9 年前

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

    示例文件:

    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
    
    2 回复  |  直到 9 年前
        1
  •  1
  •   fedorqui    9 年前

    通常,对于这些场景,最好使用适当的csv解析器。例如,您可以在Python中找到它们。

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

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

    在里面 TXR Lisp(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