我正在使用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。这些是我熟悉的语言。虽然我也对其他解决方案感兴趣。
答案 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}