我有一组csv文件(大约250个),每个文件有300到500条记录。我需要从每个文件中删除2或3列并将其存储到另一个文件中。我正在使用 ubuntu OS 。有没有办法在命令或实用程序中执行此操作?
答案 0 :(得分:26)
如果您知道字段内没有列分隔符,则可以使用cut。
$ cat in.csv
foo,bar,baz
qux,quux,quuux
$ cut -d, -f2,3 < in.csv
bar,baz
quux,quuux
您可以使用shell buildin'for'循环遍历所有输入文件。
答案 1 :(得分:11)
如果字段可能包含分隔符,您应该找到一个可以解析CSV文件的库。通常,通用脚本语言将在其标准库中包含CSV模块。
Ruby: require 'csv'
Python: import csv
Perl: use Text::ParseWords;
答案 2 :(得分:9)
如果您的字段包含逗号或换行符,则可以使用我编写的帮助程序来允许剪切(以及其他UNIX文本处理工具)正确处理数据。
https://github.com/dbro/csvquote
此程序在引用字段中查找特殊字符,并暂时用非打印字符替换它们,这些字符不会混淆剪切程序。然后他们在切割完成后恢复。
lutz'解决方案将成为:
csvquote in.csv | cut -d, -f2,3 | csvquote -u
答案 3 :(得分:0)
如果您使用ssconvert
获取CSV,则可以尝试:
ssconvert -O 'separator="|"' "file.xls" "file.txt"
请注意 TXT 扩展名 CSV ,这种方式将使用 Gnumeric_stf:stf_assistant 导出程序而不是 Gnumeric_stf:stf_csv ,它允许您使用选项(-O
参数)。否则,您将获得文件保护程序不会出现选项错误。管道角色更不可能,但您可能想要先检查。
然后你可以重命名它并执行以下操作:
cat file.csv | cut -d "|" -f3 | sort | uniq -c | sort -rn | head
-O 'eol=unix separator=; format=preserve charset=UTF-8 locale=en_US transliterate-mode=transliterate quoting-mode=never'
。ssconvert
man page。