如何从CSV文件中获取每行的第一列?

47

如何从输入的CSV文件中获取每行的第一列并将其输出到一个新文件中?我想使用awk,但不确定如何操作。


2
第一列可以包含,吗? - Karoly Horvath
2
更加通用的问题:你的文件使用哪种CSV方言? - user647772
6个回答

86

试试这个:

 awk -F"," '{print $1}' data.txt
它将根据指定的逗号字符(-F),将文件data.txt中的每个输入行分割为不同的字段,并将第一个字段(列)打印到标准输出(stdout)。

3
@downvoter..没有说明的负评对任何人都没有帮助(原帖作者、Stack Overflow 或我)。这是一个满足原帖作者要求的功能性解决方案。我很乐意纠正错误或改善我的回答,但这需要建设性反馈。 - Levon
2
我没有给你的回答投反对票,但我也不会点赞:因为使用awk代替cut是一种非常笼统的写法;如果使用perl或者sed,情况也不会好到哪里去。这并没有错,只是不够严谨。如果你能给出一个处理csv文件的awk脚本,如 "last, first",field2,field3 ,那才是更加恰当的做法。 - sorpigal
3
如果你用cut代替awk,我就不会给点踩了 :-) 两者都可以完成这个任务。顺便说一下,OP在他们的帖子中提到了awk,并且我给一个“竞争”的cut解决方案点了赞(如果你发布了,也可以成为你的方案)。这不是宗教,只是一个需要完成的小任务,我选择了其中的一个工具来完成它。 - Levon
我是Shell脚本的新手。有人能解释一下如何在分隔符为制表符而不是逗号时编写它吗? - DarkRose
@DarkRose 我现在时间很紧,无法测试它,但请尝试使用\t代替上面的逗号。 - Levon
显示剩余3条评论

70

可以完成:

$ cut -d, -f1 data.txt

这是所有答案中最快的,适用于大型CSV文件。我的情况涉及一个2GB的文件,其中包含看起来像 2021-12-26,472406,616125 的行。使用 cut 获取第一列,这个答案需要 5.1 秒。使用 Awk (awk -F, '{print $1}') 需要40秒。使用 Perl (perl -F, -lane 'print $F[0]') 需要49秒。使用 Ripgrep (rg -o '^[^,]+') 需要27秒。使用 GNU grep (grep -o '^[^,]\+') 需要177秒。 - dtolnay

12
echo "a,b,c" | cut -d',' -f1 > newFile

3
如果shell能够处理未转义的定界符,那么在定界符周围使用单引号是不必要的。 - user647772
1
+1 给反对票投一票。这个答案可以说是最完整和正确的! - sorpigal

5

输入

a,12,34
b,23,56

代码

awk -F "," '{print $1}' Input

格式

awk -F <delimiter> '{print $<column_number>}' Input

1
这可以通过使用grep来实现:
$ grep -o '^[^,]\+' file.csv

-1

使用Perl:

perl -F,-lane'print $F [0]' data.txt> data2.txt

这些命令行选项用于:

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

如果您想直接修改原始文件,请使用-i选项: perl -i -lane 'print $F[0]' data.txt
如果你想要直接在原始文件上进行修改并备份:
``` perl -i.bak -lane 'print $F[0]' data.txt ```
如果您的数据是空格分隔而非逗号分隔: perl -lane 'print $F[0]' data.txt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接