使用换行符作为分隔符将文件转换为CSV

时间:2013-08-19 19:32:28

标签: shell csv awk

我有很多数据是新行分隔的,从服务器复制原始数据。但是,我无法将所有\n替换为逗号,因此我无法将其转换为CSV,因为我需要拥有这些字段。这个场合有9个领域。如何转换此数据?
请记住,最后一个元素不需要逗号,因为它需要保留换行符。

我对正则表达式foo很恐怖,但由于我需要循环,我想我需要把它变成shell脚本吗?

非常感谢任何帮助。

示例数据:

Name
Logon User
IP Address
Version
Last Login
Restart Required
Foo1
Foo2
Foo3
Jon Weinraub
jweinraub
10.18.66.10
3.1.1.1
2013-08-19 14:33:11
No
Bar1
Bar2
Bar3
Homer Simpson
....

所以基本上它应该是

Name,Logon User, IP,...Foo3
Jon Weinraub,jweinraub,10.18.66.10,...Bar3
Homer Simpson,....

4 个答案:

答案 0 :(得分:4)

这条线是否符合您的要求?

awk 'NR%9{printf "%s,",$0;next}7' file

例如:

kent$  seq 36|awk 'NR%9{printf "%s,",$0;next}7'
1,2,3,4,5,6,7,8,9
10,11,12,13,14,15,16,17,18
19,20,21,22,23,24,25,26,27
28,29,30,31,32,33,34,35,36

答案 1 :(得分:1)

使用awk的一种稍微复杂的方式(但很容易理解和修改):

使用以下脚本创建文件makeCSV.awk

BEGIN {
  count = 0; 
}

{
  count++;
  if (count == 9)
  { 
    count = 0;
    printf "%s\n", $0;
  }
  else
  {
    printf "%s, ", $0;
  }
}

然后您可以使用

从命令行执行此操作
awk -f makeCSV.awk myInputFile > myOutputFile.csv

答案 2 :(得分:1)

一个不错的awk变体:

awk 'ORS = NR%9 ? "," : "\n"'

ORS是输出记录分隔符。对于除第9行以外的所有行,它被设置为“,”,因为它总是“,”或“\ n”,表达式总是计算为true,打印记录的默认操作(ORS后面的行)是在每一行输入上执行。

答案 3 :(得分:0)

我之前也遇到过这个问题,我可能会被误解,但是我通过在行尾添加“\ r \ n”来解决我的问题,将下一位数据放到新行上。例如,你有像

这样的东西
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,

您需要用“\ r \ n”替换最后一个逗号。如果这不是你所要求的,请告诉我......