有条件地替换csv文件中的字段值

时间:2016-09-07 04:35:00

标签: bash csv

我正在使用bash脚本转换大量CSV文件。它们都具有相同的结构和相同的标题名称。列中的值当然是可变的。 Col4始终是整数。

源文件:

Col1;Col2;Col3;Col4
Name1;Street1;City1;2
Name2;Street2;City2;12
Name3;Street3;City3;15
Name4;Street4;City4;10
Name5;Street5;City5;3

现在,当Col4包含某个值时,例如" 10",则必须在" 10个"中更改值。并且必须复制完整的行。 每5个人一行。 所以你可以说重复的数量是Col4的值除以5然后向上舍入。 因此,如果Col4 = 10,我需要2个重复,如果Col4 = 12,我需要3个重复。

结果文件:

Col1;Col2;Col3;Col4
Name1;Street1;City1;2
Name2;Street2;City2;... of 12
Name2;Street2;City2;... of 12
Name2;Street2;City2;... of 12
Name3;Street3;City3;... of 15
Name3;Street3;City3;... of 15
Name3;Street3;City3;... of 15
Name4;Street4;City4;... of 10
Name4;Street4;City4;... of 10
Name5;Street5;City5;3

任何人都可以帮我把它放在脚本中。什么与bash,sed,awk。这些是我熟悉的语言。虽然我也对其他解决方案感兴趣。

2 个答案:

答案 0 :(得分:0)

这是awk代码,假设输入位于名为/ tmp / input

的文件中
 awk -F\; '$4 < 5 {print}; $4 > 5  {for (i = 0; i < ($4/5); i++) printf "%s;%s;%s;...of %s\n",$1,$2,$3,$4}' /tmp/input

说明:

有两条规则。

第一条规则打印$4小于5的所有行。这也将打印标题

 $4 < 5 {print}

如果$4大于5,则打印第二条规则。循环运行$4/5次:

 $4 > 5 {for (i=0; i< ($4/5); i++) printf "%s;%s;%s;...of %s\n",$1,$2,$3,$4}

输出:

    Col1;Col2;Col3;Col4
    Name1;Street1;City1;2
    Name2;Street2;City2;...of 12
    Name2;Street2;City2;...of 12
    Name2;Street2;City2;...of 12
    Name3;Street3;City3;...of 15
    Name3;Street3;City3;...of 15
    Name3;Street3;City3;...of 15
    Name4;Street4;City4;...of 10
    Name4;Street4;City4;...of 10
    Name5;Street5;City5;3

代码不处理$4 == 5的用例。您可以通过添加第三条规则来处理。我没有补充说。但我认为你有这个主意。

答案 1 :(得分:0)

谢谢周杰伦!这正是我所需要的。

这是我现在使用的最终awk代码:

 awk -F\; '$4 == "Col4" {print}; $4 < 5 {print}; $4 == 5 {print}; $4 > 5  {for (i = 0; i < ($4/5); i++) printf "%s;%s;%s;...of %s\n",$1,$2,$3,$4}' /tmp/input

我添加了以下规则来打印标题,因为它没有打印

 $4 == "Col4" {print}

我添加了以下规则来打印值等于5的行

 $4 == 5 {print}