我有很多数据是新行分隔的,从服务器复制原始数据。但是,我无法将所有\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,....
答案 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”替换最后一个逗号。如果这不是你所要求的,请告诉我......