操作系统: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
似乎无效,无论是打印第一行还是什么都没有,所以我认为它无法逐行读取。
答案 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]