将csv文件的第一列解析为新文件

时间:2010-04-16 11:28:31

标签: bash csv sed awk cut

操作系统: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 个答案:

答案 0 :(得分:34)

你的最后一个选项对我来说非常合适:

$ 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 is what you want

答案 1 :(得分:11)

我将您的示例输入复制粘贴,保存为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

答案 2 :(得分:3)

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

cut -d, -f1 < in.csv > out.txt

答案 3 :(得分:0)

如果Perl是一个选项:

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

使用以下命令行选项:

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

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

开头编制索引