从CSV文件中删除列的Shell脚本命令

3
我正在尝试从一个CSV文件中删除一列(该列作为变量从预处理中获取)。
我查看了提供的示例并尝试了以下操作。
cut -d ',' -f 2 X.csv > Y.csv

上述命令没有帮助 - 从X.csv复制的第二列被复制到Y.csv

我想要删除第二列以及分隔符

例如:

name,place,animal
a,chicago,python
b,new york,squirrel

使用 cut 命令后,文件应该如下所示:
name,animal
a,python
b,squirrel
4个回答

5
不要选择要删除的文件,而是选择要保留的文件!(注:该内容涉及IT技术)
cut -d ',' -f 1,3- X.csv > Y.csv

无论如何,如果你选择删除一列而不是保留其他列(同一件事情,不同的观点),你也可以使用补集标志:

cut -d ',' -f 2 --complement X.csv > Y.csv

我在几个文件中有大约150列 - 这对我没有帮助!! - undefined
1
我给你的语法将适用于你拥有的任意列数。无论如何,我添加了complement标志,更接近你的思维设置。 - undefined
转义的逗号怎么处理? - undefined
@madhavg 如果你使用第二种语法,你只需要指定你想要删除的列。所以,如果你要删除150列中的1列,仍然只是一个数字。 - undefined

3

man cut:

--complement
       complement the set of selected bytes, characters or fields

让我们试试:

$ cut -d , -f 2 --complement file
name,animal
a,python
b,squirrel

3
你可以使用来自csvkit的csvcut进行翻译。
-C提供了你所需要的功能。 https://csvkit.readthedocs.io/en/1.0.3/scripts/csvcut.html
   -C NOT_COLUMNS, --not-columns NOT_COLUMNS
                        A comma separated list of column indices, names or
                        ranges to be excluded, e.g. "1,id,3-5". Defaults to no
                        columns.

0

很多编程语言都附带有CSV解析模块。我喜欢Ruby的一行代码解析器:

ruby -rcsv -e '
  CSV.foreach(ARGV.shift) do |row|
    row.delete_at 1   # "1" is the 2nd field due to 0-based array indexing.
    puts row.to_csv
  end
' file.csv

或者,如果你喜欢一行代码的写法
ruby -rcsv -e 'CSV.foreach(ARGV.shift) {|row| row.delete_at 1; puts row.to_csv}' file.csv

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接