如何合并文件中前n行的内容

8

我正在尝试清理一些数据,并最终想将其以CSV形式呈现。

我已经使用了一些正则表达式进行清理,但是卡在了一个步骤上。

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

数据看起来像这样:

field1
field2
field3
field1
field2
field3

etc..

I need it in

field1,field2,field3
field1,field2,field3

有没有一种使用sed或awk来简单地完成这件事的方法?我可以编写一个程序并使用带有模数计数器的循环来删除每个第1和第2个换行符,但如果可能的话,我宁愿从命令行中完成。

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的倍数时,逗号分隔符就会被插入。在文件末尾,如果该字符串不为空且去除了尾部逗号,则会打印该字符串。

5

Awk 版本:

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

4

这是一个Perl解决方案,它更短,并且可以处理不是3行倍数的文件:

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

非三的倍数文件那个很好。我知道我的程序没有处理它,但是我在这个问题上花了3分钟没有看到解决方案。 - jj33

1

这可能适合你:

paste -sd',,\n' file

或者这样:

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

1

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

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

1

cat file | perl -ne 'chomp(); print $_, !(++$i%3) ? "\n" : ",";'

将文件 cat | perl -ne 'chomp(); print $_, !(++$i%3) ? "\n" : ",";' 输出


0

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

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


0

vim 版本:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接