2016-09-07 101 views
0

我正在用bash脚本转换大量的CSV文件。它们都具有相同的结构和相同的标题名称。当然,列中的值是可变的。 Col4总是一个整数。有条件地替换csv文件中的字段值

源文件:

 
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。这些是我熟悉的语言。尽管我也对其他解决方案感兴趣。

+0

可以在您的问题中提供示例输入和输出吗? –

+0

编辑了一个更好的例子,thnx纠正问题btw :) – user6802941

回答

0

这里是AWK代码假定输入是在一个叫做/文件TMP /输入

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。你可以通过添加第三条规则来处理。我没有补充说。但我认为你有这个想法。

0

谢谢Jay!这正是我需要的。

这是我现在使用的最终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} 
+0

您可以选择使用''NR == 1'条件打印标题。这比'$ 4 ==“Col4”'更通用 –