44

操作系统:OSX 方法:从命令行,所以使用sed、cut、gawk,虽然最好不要安装模块。

本质上,我正在尝试获取 csv 文件的第一列并将其解析为新文件。

示例输入文件

EXAMPLEfoo,60,6
EXAMPLEbar,30,6
EXAMPLE1,60,3
EXAMPLE2,120,6
EXAMPLE3,60,6
EXAMPLE4,30,6

期望输出

EXAMPLEfoo 
EXAMPLEbar
EXAMPLE1
EXAMPLE2
EXAMPLE3
EXAMPLE4

所以我想要第一列。

这是我到目前为止所尝试的:

awk -F"," '{print $1}' in.csv > out.txt

awk -F"," '{for (i=2;i<=NF;i++)}' in.csv > out.txt

awk -F"," 'BEGIN { OFS="," }' '{print $1}' in.csv > out.txt

cat in.csv | cut -d \, -f 1 > out.txt

似乎都不起作用,要么他们只打印第一行,要么什么都不打印,所以我认为它无法逐行读取。

4

4 回答 4

51

您的最后一个选项对我来说非常有效:

$ cat > in.csv  # Then pasted the example input followed by Ctrl+D:
EXAMPLEfoo,60,6
EXAMPLEbar,30,6
EXAMPLE1,60,3
EXAMPLE2,120,6
EXAMPLE3,60,6
EXAMPLE4,30,6
[Ctrl+D]
$ cat in.csv | cut -d, -f1
EXAMPLEfoo
EXAMPLEbar
EXAMPLE1
EXAMPLE2
EXAMPLE3
EXAMPLE4

也许行尾在这里咬你?如果文件具有 DOS 风格甚至旧 Mac 风格的行尾,这可能会导致奇怪的行为。尝试运行file in.csv,看看会发生什么。

$ file in.unix.csv
in.unix.csv: ASCII text
$ file in.dos.csv
in.dos.csv: ASCII text, with CRLF line terminators

如果是后者,请使用该dos2unix工具转换文件。

编辑:在 OS X 上,这似乎flip是你想要的。

于 2010-04-16T11:33:34.043 回答
15

我复制粘贴了您的示例输入,将其保存为 in.csv,然后运行您的第一行,

awk -F"," '{print $1}' in.csv > out.txt

它工作得很好,就像这样:

$ emacs in.csv
$ cat in.csv 
EXAMPLEfoo,60,6
EXAMPLEbar,30,6
EXAMPLE1,60,3
EXAMPLE2,120,6
EXAMPLE3,60,6
EXAMPLE4,30,6
$ awk -F"," '{print $1}' in.csv > out.txt
$ cat out.txt 
EXAMPLEfoo
EXAMPLEbar
EXAMPLE1
EXAMPLE2
EXAMPLE3

这是在 OS X 10.5 上的 Terminal.app 中

于 2010-04-16T11:32:22.110 回答
7

对我来说, cut 会产生预期的结果:

cut -d, -f1 < in.csv > out.txt
于 2010-04-16T11:32:39.783 回答
1

如果 Perl 是一个选项:

perl -F, -lane 'print $F[0]' in.csv > out.txt

使用这些命令行选项:

  • -n循环输入文件的每一行
  • -l在处理之前删除换行符,然后将它们添加回来
  • -a自动拆分模式——将输入行拆分到@F数组中。默认为空格分割。
  • -e执行 perl 代码
  • -F自动拆分修饰符,在这种情况下拆分,

@F是每行中的单词数组,索引从$F[0]

于 2015-11-13T22:30:43.330 回答