如何连接文件中的前n行

发布于 2024-07-14 21:42:19 字数 401 浏览 7 评论 0原文

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

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

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

数据看起来像这样:

field1
field2
field3
field1
field2
field3

等等..

我需要它在

field1,field2,field3
field1,field2,field3

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

I am trying to clean up some data, and I would eventually like to put it in CSV form.

I have used some regular expressions to clean it up, but I'm stuck on one step.

I would like to replace all but every third newline (\n) with a comma.

The data looks like this:

field1
field2
field3
field1
field2
field3

etc..

I need it in

field1,field2,field3
field1,field2,field3

Anyone have a simple way to do this using sed or awk? I could write a program and use a loop with a mod counter to erase every 1st and 2nd newline char, but I'd rather do it from the command line if possible.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(8

债姬 2024-07-21 21:42:20

awk版本:

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

Awk version:

awk '{if (NR%3==0){print $0;}else{printf "%s,", $0;}}'
马蹄踏│碎落叶 2024-07-21 21:42:20

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

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

A Perl solution that's a little shorter and that handles files that don't have a multiple of 3 lines:

perl -pe 's/\n/,/ if(++$i%3&&! eof)' yourData.txt
几度春秋 2024-07-21 21:42:20

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

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

一个人的旅程 2024-07-21 21:42:20

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

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

Use nawk or /usr/xpg4/bin/awk on Solaris:

awk 'ORS=NR%3?OFS:RS' OFS=, infile
且行且努力 2024-07-21 21:42:20

这可能对你有用:

paste -sd',,\n' file

或者这个:

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

This might work for you:

paste -sd',,\n' file

or this:

sed '$!N;$!N;y/\n/,/' file
毁我热情 2024-07-21 21:42:20

维姆版本:

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

vim version:

:1,$s/\n\(.*\)\n\(.*\)\n/,\1,\2\r/g
_失温 2024-07-21 21:42:20

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

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

蓝海似她心 2024-07-21 21:42:19

使用 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 的倍数,就插入逗号分隔符。在文件末尾,如果满足,则打印该字符串删除尾随逗号后不为空。

With awk:

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

This script saves the last three lines and print them at every third line. Unfortunately, this works only with files having a multiple of 3 lines.

A more general script is:

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

In this case, the last three lines are concatenated in a single string, with the comma separator inserted whenever the line number is not a multiple of 3. At the end of the file, the string is printed if it is not empty with the trailing comma removed.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文