【问题标题】:Parsing the first column of a csv file to a new file将 csv 文件的第一列解析为新文件
【发布时间】:2011-02-08 19:08:47
【问题描述】:

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

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

【问题讨论】:

  • 正如我在回答您之前的(并且非常相似的)问题时指出的那样,我的 FOSS 项目 code.google.com/p/csvfix 正是这样做的,比 awk 等更容易用于解析 CSV,并且可以工作在 OSX 上。

标签: bash csv sed awk cut


【解决方案1】:

您的最后一个选项非常适合我:

$ 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

【讨论】:

  • 你发现了行尾,现在修复它。
【解决方案2】:

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

【讨论】:

  • 这很奇怪,awk 最近一直在给我问题。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    如果 Perl 是一个选项:

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

    使用这些命令行选项:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-22
      • 1970-01-01
      • 2014-01-03
      • 1970-01-01
      • 2011-11-17
      • 1970-01-01
      • 2016-10-29
      相关资源
      最近更新 更多