如何在文件中连接前n行

时间:2009-03-12 20:45:06

标签: regex linux sed awk

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

我已经使用了一些正则表达式来清理它,但我只是坚持一步。

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

数据如下所示:

field1
field2
field3
field1
field2
field3

等。

我需要它

field1,field2,field3
field1,field2,field3

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

8 个答案:

答案 0 :(得分: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的倍数就插入逗号分隔符。在文件末尾,如果字符串不为空则打印该字符串删除尾随逗号。

答案 1 :(得分:5)

Awk版本:

awk '{if (NR%3==0){print $0;}else{printf "%s,", $0;}}'

答案 2 :(得分:4)

Perl解决方案,它更短,处理没有3行多个的文件:

perl -pe 's/\n/,/ if(++$i%3&&! eof)' yourData.txt

答案 3 :(得分:1)

cat file | perl -ne'chomp();打印$ _,!(++ $ i%3)? “\ n”:“,”;'

答案 4 :(得分:1)

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

awk 'ORS=NR%3?OFS:RS' OFS=, infile

答案 5 :(得分:1)

这可能对您有用:

paste -sd',,\n' file

或者这个:

sed '$!N;$!N;y/\n/,/' file

答案 6 :(得分:0)

vim版本:

:1,$s/\n\(.*\)\n\(.*\)\n/,\1,\2\r/g

答案 7 :(得分:0)

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