8

我正在尝试清理一些数据,我最终想把它放在 CSV 格式中。

我已经使用了一些正则表达式来清理它,但我被困在了一步。

我想用逗号替换除每三个换行符 (\n) 之外的所有换行符。

数据如下所示:

field1
field2
field3
field1
field2
field3

ETC..

我需要它

field1,field2,field3
field1,field2,field3

任何人都有使用 sed 或 awk 的简单方法来做到这一点?我可以编写一个程序并使用带有 mod 计数器的循环来擦除每个第一个和第二个换行符,但如果可能的话,我宁愿从命令行执行它。

4

8 回答 8

7

使用 awk:

awk '{n2=n1;n1=n;n=$0;if(NR%3==0){printf"%s,%s,%s\n",n2,n1,n}}' yourData.txt

此脚本保存最后三行并在每三行打印一次。不幸的是,这仅适用于具有 3 行倍数的文件。

更通用的脚本是:

awk '{l=l$0;if(NR%3==0){print l;l=""}else{l=l","}}END{if(l!=""){print substr(l,1,length(l)-1)}}' yourData.txt

在这种情况下,最后三行连接在一个字符串中,当行号不是 3 的倍数时插入逗号分隔符。在文件末尾,如果字符串不为空且尾随字符串,则打印该字符串逗号已删除。

于 2009-03-12T20:55:10.970 回答
5

awk 版本:

awk '{if (NR%3==0){print $0;}else{printf "%s,", $0;}}'
于 2009-03-12T21:08:07.177 回答
4

一个短一点的 Perl 解决方案,它可以处理不具有 3 行倍数的文件:

perl -pe 's/\n/,/ if(++$i%3&&! eof)' yourData.txt
于 2009-03-13T03:16:42.800 回答
1

猫文件 | perl -ne 'chomp(); 打印 $_, !(++$i%3) ? "\n" : ",";'

于 2009-03-12T21:01:50.390 回答
1

Solaris上使用nawk/usr/xpg4/bin/awk

awk 'ORS=NR%3?OFS:RS' OFS=, infile
于 2009-03-13T11:22:24.473 回答
1

这可能对您有用:

paste -sd',,\n' file

或这个:

sed '$!N;$!N;y/\n/,/' file
于 2012-02-24T06:45:38.433 回答
0

vim 版本:

:1,$s/\n\(.*\)\n\(.*\)\n/,\1,\2\r/g
于 2009-03-13T04:06:10.730 回答
0

awk '{ORS=NR%3?",":"\n";print}' urdata.txt

于 2009-04-02T04:06:37.457 回答