如何在Unix中删除CSV中的某些列?

9wbgstp7  于 2023-04-27  发布在  Unix
关注(0)|答案(5)|浏览(124)

我有一个17列的文件与逗号分隔符和双引号,如果有任何逗号可用的值。有一个例子下面的几列

Jim,State,123456,Region1,759358,Yes,District1,
"frank, jr",State,789123,"Region2,Dummy",12345,No,District2,

我试过这个密码

sed 's/[^,]*,//' file

我正在获取输出

State,123456,Region1,759358,Yes,District1,
 jr",State,789123,"Region2,Dummy",12345,No,District2,

但我需要输出为

State,123456,Region1,759358,Yes,District1,
State,789123,"Region2,Dummy",12345,No,District2,

实际上,在删除第一列之后,我需要在表中加载这些值。所以逗号delimeter应该可以完美地工作,然后才能加载。我只能使用awk或sed来实现这一点。

kpbwa7wx

kpbwa7wx1#

这可能对你有用(GNU sed):

sed -E 's/^("[^"]*"|[^,]*),//' file

从行首删除任何双引号字段或任何非逗号字符,后跟逗号。

wnvonmuf

wnvonmuf2#

最好使用真实的的CSV解析器csvkit

$ csvcut -c2- file.csv

使用perlText::CSV_XS解析器:

perl -MText::CSV_XS -nE '
    BEGIN{our $csv = Text::CSV_XS->new()}
    $csv->parse($_) or die $!;
    my @F = $csv->fields();
    say join ",", @F[1..$#F]
' file

也可以使用miller
imported extra functions
(需要gawk版本〉= 4.1.0)

gawk '@include "csvmode1"; {sub("^"OFS, "")} 1' file.csv

对于gawk,使用FPAT

awk 'BEGIN{OFS=","; FPAT="([^,]*)|(\"[^\"]+\")"} {sub("^"OFS, "")} 1' file.csv
4jb9z9bj

4jb9z9bj3#

你应该使用一种对CSV数据有强大支持的语言,比如Python。下面是一个简单的脚本:

import csv

with open("data.csv") as instream, open("out.csv", "w") as outstream:
    reader = csv.reader(instream)
    writer = csv.writer(outstream)

    for row in reader:
        del row[0]
        writer.writerow(row)

这个脚本假定输入文件名为“data.csv”,并将输出写入“out.csv”

tkqqtvp1

tkqqtvp14#

一个awk的想法:

awk '
{ if (match($0,/"[^"]*",/))
     start = RLENGTH+1
  else { 
     match ($0,/,/)
     start = RSTART+1
  }
  print substr($0,start)
}' file

这产生:

State,123456,Region1,759358,Yes,District1,
State,789123,"Region2,Dummy",12345,No,District2,
gab6jxml

gab6jxml5#

正如其他人所说,最简单的最佳选择是某种形式的CSV解析器。
下面是一个Ruby:

ruby -r csv -e '
puts CSV.generate{|csv| 
CSV.parse($<.read).each{|row| csv<<row[1..]}}' file

图纸:

State,123456,Region1,759358,Yes,District1,
State,789123,"Region2,Dummy",12345,No,District2,

相关问题