使用shell或perl脚本在csv中插入带有标题的空白列

时间:2014-06-02 10:34:12

标签: perl shell

我正在尝试插入空白列作为预先定义的位置,它只包含标题(没有值),然后用新的替换原始csv。 简而言之,我的输入csv文件就像(没有固定行数):

cat sample.csv

CI Ref,SerialNumber,Last Report Time
VMware-42 2b cb d6 e7 36 ec 73-f4 77 bd 2b f2 6f 25 5d,VMware-42 2b cb d6 e7 36 ec 73-f4 77 bd 2b f2 6f 25 5d,"Fri, 30 May 2014 12:23:13 +0000"
VMware-42 2b 79 e0 da 18 2e 9e-17 b2 6e e1 67 df 3c 6b,VMware-42 2b 79 e0 da 18 2e 9e-17 b2 6e e1 67 df 3c 6b,"Fri, 30 May 2014 12:26:08 +0000"
VMware-42 2b e7 9e 5e c6 48 b6-25 36 6e 1e da 6c 6d d2,VMware-42 2b e7 9e 5e c6 48 b6-25 36 6e 1e da 6c 6d d2,"Fri, 30 May 2014 12:39:54 +0000"
VMware-42 2b b0 e5 dc 56 bd 89-f2 87 de 0b 17 11 43 6e,VMware-42 2b b0 e5 dc 56 bd 89-f2 87 de 0b 17 11 43 6e,"Fri, 30 May 2014 12:39:58 +0000"
VMware-42 2b e6 f0 6a 81 a5 f8-58 f3 9b 07 71 31 10 f8,VMware-42 2b e6 f0 6a 81 a5 f8-58 f3 9b 07 71 31 10 f8,"Fri, 30 May 2014 12:46:30 +0000"
VMWARE-42_2B_6A_35_14_1E_87_54-35_75_8E_2E_33_66_94_44,VMWARE-42_2B_6A_35_14_1E_87_54-35_75_8E_2E_33_66_94_44,"Fri, 30 May 2014 12:49:21 +0000"
VMware-42 2b d9 2d de 16 64 96-43 c3 f8 4a c2 18 c7 8b,VMware-42 2b d9 2d de 16 64 96-43 c3 f8 4a c2 18 c7 8b,"Fri, 30 May 2014 12:51:46 +0000"
VMware-42 2b dd 58 9f 55 f0 c5-04 06 3a a4 26 dd cc 3c,VMware-42 2b dd 58 9f 55 f0 c5-04 06 3a a4 26 dd cc 3c,"Fri, 30 May 2014 12:52:45 +0000"
VMware-42 2b e5 49 0f ac 9c a7-23 bd aa 06 b2 3c df 41,VMware-42 2b e5 49 0f ac 9c a7-23 bd aa 06 b2 3c df 41,"Fri, 30 May 2014 12:52:50 +0000"

我正在尝试以下面的方式转换此csv(即插入空白列(仅限标题):

CI Name,CI Description,CI Ref,SerialNumber,Last Report Time,abc
<blank>,<blank>,VMware-42 2b cb d6 e7 36 ec 73-f4 77 bd 2b f2 6f 25 5d,VMware-42 2b cb d6 e7 36 ec 73-f4 77 bd 2b f2 6f 25 5d,"Fri, 30 May 2014 12:23:13 +0000",<blank>
<blank>,<blank>,VMware-42 2b 79 e0 da 18 2e 9e-17 b2 6e e1 67 df 3c 6b,VMware-42 2b 79 e0 da 18 2e 9e-17 b2 6e e1 67 df 3c 6b,"Fri, 30 May 2014 12:26:08 +0000",<blank>

3 个答案:

答案 0 :(得分:1)

Referred from here

您可以使用awksed工具。 1.在第1列之前插入新列(比如序列号)

$ awk -F, '{$1=++i FS $1;}1' OFS=, file
1,Unix,10,A
2,Linux,30,B
3,Solaris,40,C
4,Fedora,20,D
5,Ubuntu,50,E

$ 1 = ++ i FS $ 1 =&gt;空格用于连接awk中的列。此表达式将新字段(++ i)与第1个字段以及分隔符(FS)连接在一起,并将其分配回第1个字段($ 1)。 FS包含文件分隔符。

希望你能从这里开始工作。

答案 1 :(得分:1)

通常最好使用Text::CSV模块来处理CSV数据,但由于我们只添加空字段,因此无需解析任何数据 - 可以将其他列添加到文本中那里。

这样的事情会按你的要求行事

use strict;
use warnings;
use autodie;

open my $fh, '<', 'data.csv';

chomp(my $head = <$fh>);
print "CI Name,CI Description,$head,abc\n";

while (<$fh>) {
  chomp;
  print ",,$_,\n";
}

<强>输出

CI Name,CI Description,CI Ref,SerialNumber,Last Report Time,abc
,,VMware-42 2b cb d6 e7 36 ec 73-f4 77 bd 2b f2 6f 25 5d,VMware-42 2b cb d6 e7 36 ec 73-f4 77 bd 2b f2 6f 25 5d,"Fri, 30 May 2014 12:23:13 +0000",
,,VMware-42 2b 79 e0 da 18 2e 9e-17 b2 6e e1 67 df 3c 6b,VMware-42 2b 79 e0 da 18 2e 9e-17 b2 6e e1 67 df 3c 6b,"Fri, 30 May 2014 12:26:08 +0000",
,,VMware-42 2b e7 9e 5e c6 48 b6-25 36 6e 1e da 6c 6d d2,VMware-42 2b e7 9e 5e c6 48 b6-25 36 6e 1e da 6c 6d d2,"Fri, 30 May 2014 12:39:54 +0000",
,,VMware-42 2b b0 e5 dc 56 bd 89-f2 87 de 0b 17 11 43 6e,VMware-42 2b b0 e5 dc 56 bd 89-f2 87 de 0b 17 11 43 6e,"Fri, 30 May 2014 12:39:58 +0000",
,,VMware-42 2b e6 f0 6a 81 a5 f8-58 f3 9b 07 71 31 10 f8,VMware-42 2b e6 f0 6a 81 a5 f8-58 f3 9b 07 71 31 10 f8,"Fri, 30 May 2014 12:46:30 +0000",
,,VMWARE-42_2B_6A_35_14_1E_87_54-35_75_8E_2E_33_66_94_44,VMWARE-42_2B_6A_35_14_1E_87_54-35_75_8E_2E_33_66_94_44,"Fri, 30 May 2014 12:49:21 +0000",
,,VMware-42 2b d9 2d de 16 64 96-43 c3 f8 4a c2 18 c7 8b,VMware-42 2b d9 2d de 16 64 96-43 c3 f8 4a c2 18 c7 8b,"Fri, 30 May 2014 12:51:46 +0000",
,,VMware-42 2b dd 58 9f 55 f0 c5-04 06 3a a4 26 dd cc 3c,VMware-42 2b dd 58 9f 55 f0 c5-04 06 3a a4 26 dd cc 3c,"Fri, 30 May 2014 12:52:45 +0000",
,,VMware-42 2b e5 49 0f ac 9c a7-23 bd aa 06 b2 3c df 41,VMware-42 2b e5 49 0f ac 9c a7-23 bd aa 06 b2 3c df 41,"Fri, 30 May 2014 12:52:50 +0000",

答案 2 :(得分:0)

awk -v OFS=, '
    NR==1 {print "CI Name","CI Description",$0; next} 
    {print "","",$0}
' sample.csv