0

我有很多新行分隔的数据,从服务器原始复制。但是,我无法通过简单地将 all 替换\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

4 回答 4

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
于 2013-08-19T19:38:45.353 回答
1

一个不错的 awk 变体:

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

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

于 2013-08-20T12:55:37.440 回答
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
于 2013-08-19T19:51:10.737 回答
0

我以前也遇到过这个问题,我可能弄错了,但我通过在行尾添加“\r\n”来解决我的问题,将下一位数据放到新行中。所以例如你有类似的东西

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

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

于 2013-08-19T19:36:04.927 回答