2013-08-19 71 views
0

我有很多数据是新行分隔的,从服务器复制原始数据。然而,我不能将它转换成CSV,只需将所有\n替换为逗号,因为我需要有字段。这个场合有9个领域。我怎样才能转换这些数据?
请记住,最后一个元素不需要逗号,因为这需要保留换行符。使用换行符作为分隔符将文件转换为CSV

我在正则表达式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

数据当前是“每行一个数据元素”吗? – Floris

+0

所以你想用逗号替换'\ n'的每一个实例,除了每9行? – Air

+0

我在我的问题中添加了以上示例数据 –

回答

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 
+0

两条评论:a,BEGIN块没有意义,可以保存(删除)。 b,不要使用类似'printf $ 0'的东西。你不知道包含某种格式字符串的行是否与'%d,%s..'类似。当使用'printf'时,总是给出一个格式 – Kent

+0

哇,这正是我所需要的。我一直忘记我也可以使用awk作为脚本语言,因为我通常使用它来分析打印$ 3的列等。 –

+0

理论上,如果行的话,应该使用'printf'%s \ n“,$ 0'来避免问题包含任何'%'字符。你可能不希望逗号后的空格,所以应该是'printf'%s,“,$ 0'。只有当一行中有多个语句时才需要分号,但它们也不会造成任何伤害。 –

0

我以前有这个问题为好,我可mistaked,但我加入解决了我的问题“ \ r \ n“到该行的末尾,将下一位数据放到新行中。因此,举例来说,您有类似的东西

NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 

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

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 
+0

这也是一个很棒的单线程! –

+0

你为什么用'7'打印?在99.9%的awk中,我看到人们使用'1'。我建议你也这样做。这是为了让初学者很容易理解这一点是相同的。 – Jotne

+0

@Jotne我更喜欢用正确的食指,而我喜欢超过1的7个。对于新手来说,最好能看到不同的东西。他们会知道除0之外的所有号码都可以工作。 Thx为您的建议。但我会坚持7 – Kent

1

好用AWK变体线:

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

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

相关问题