如何剪切CSV文件

时间:2014-07-21 15:37:25

标签: linux bash awk sed cut

我有以下CSV文件

 more file.csv

 Number,machine_type,OS,Version,Mem,CPU,HW,Volatge

 1,HG652,linux,23.12,256,III,LOP90,220
 2,HG652,linux,23.12,256,III,LOP90,220
 3,HG652,SCO,MK906G,526,1G,LW1005,220
 4,HG652,solaris,1172,1024,2Core,netra,220
 5,HG652,solaris,1172,1024,2Core,netra,220

请建议如何剪切CSV文件(通过cut或sed或awk命令)

以获取部分CSV文件

  • 命令需要获取表示我们要从CSV中删除的字段的值

    根据示例1 (值应 6

示例1

在这个例子中,我们从左到右切割了6个字段,(在这种情况下,CSV将如下所示)

  Number,machine_type,OS,Version,Mem,CPU

  1,HG652,linux,23.12,256,III
  2,HG652,linux,23.12,256,III
  3,HG652,SCO,MK906G,526,1G
  4,HG652,solaris,1172,1024,2Core
  5,HG652,solaris,1172,1024,2Core

2 个答案:

答案 0 :(得分:7)

cut是你的朋友:

$ cut -d',' -f-6 file
Number,machine_type,OS,Version,Mem,CPU

1,HG652,linux,23.12,256,III
2,HG652,linux,23.12,256,III
3,HG652,SCO,MK906G,526,1G
4,HG652,solaris,1172,1024,2Core
5,HG652,solaris,1172,1024,2Core

解释

  • -d','将逗号设置为字段分隔符
  • -f-6根据该分隔符打印到第6个字段。它相当于-f1-6,因为1是默认值。

如果需要,awk也可以成功:

$ awk -v FS="," 'NF{for (i=1;i<=6;i++) printf "%s%s", $i, (i==6?RS:FS)}' file
Number,machine_type,OS,Version,Mem,CPU
1,HG652,linux,23.12,256,III
2,HG652,linux,23.12,256,III
3,HG652,SCO,MK906G,526,1G
4,HG652,solaris,1172,1024,2Core
5,HG652,solaris,1172,1024,2Core

答案 1 :(得分:3)

剪切命令行非常简单,非常适合您的情况:

cut -d, -f1-6 yourfile

所以每个人都同意说 cut 方式是这种情况下最好的方法。但是我们也可以谈谈 awk 解决方案,在那里我可能会指出,在fedorqui的回答中,一个聪明的技巧用于沉默空行(NF作为选择模式),但它有缺点,例如从原始文件中删除空行。我在下面提出另一个解决方案(en passant,使用-F选项而不是FS上的变量传递机制,它保留任何空行,并且还尊重少于6个字段的行,例如打印这些行而不添加那里有额外的逗号:

awk -F, '{min=(NF>6?6:NF); for (i=1;i<=min-1;i++) printf "%s,", $i; printf "%s\n", $6}' yourfile

这很好用,因为printf-ing $6永远不会出错,即使该行少于6个字段。我的 gawk 4.0.1,至少......

也是如此