Linux 使用Perl/AWK将两个连续的行放在一行中

Linux 使用Perl/AWK将两个连续的行放在一行中,linux,perl,unix,text,awk,Linux,Perl,Unix,Text,Awk,我有如下数据: abcd join abcd efgh join efgh 我想把这两个连续的对连成一行。 结果: abcd join abcd efgh join efgh 如何在Perl/AWK中实现这一点?我的第一直觉: perl -lne 'if ($. % 2) { $last = $_; } else { print "$last $_" }' 受@kev的sed解决方案启发,该版本更加简洁: perl -lpe '$_ .= " " . <>; chomp' p

我有如下数据:

abcd
join abcd
efgh
join efgh
我想把这两个连续的对连成一行。 结果:

abcd join abcd
efgh join efgh
如何在Perl/AWK中实现这一点?

我的第一直觉:

perl -lne 'if ($. % 2) { $last = $_; } else { print "$last $_" }'
受@kev的sed解决方案启发,该版本更加简洁:

perl -lpe '$_ .= " " . <>; chomp'
perl -pe'$.%2&&s/
/ /' file
perl-lpe'$\='';嚼
但我认为sed赢了这一轮。

最简单的方法是:

$ sed 'N;s/\n/ /' input.txt
abcd join abcd
efgh join efgh
paste - - < FILE
粘贴---
这将使用空格而不是选项卡进行连接:

paste -d" " - - < FILE
paste-d”“-
Perl:

perl -pe's/\n/ / if $. % 2' file

高尔夫挑战赛:将上面的长度缩短5个字符

高尔夫挑战解决方案:

perl -lpe '$_ .= " " . <>; chomp'
perl -pe'$.%2&&s/
/ /' file

如果给定了列表,则在分隔符之间交替粘贴。

您的输出随编辑而更改——第一个没有多余的空间,第二个没有多余的空间。另外,
join
本身在数据中是明确的还是仅仅是一个不幸的巧合?我更喜欢这个,而不是我的。这是如何工作的?我可以从sed手册中看到,N命令将输入附加到模式空间和;似乎是一个命令分隔符。怎么每隔一行就打印一次?我不明白它是怎么工作的,你能解释一下吗?:)很好,除了插入标签<代码>粘贴-d“-
更匹配所需的输出。你不需要
cat
管道,只要
paste-d”“-
@Mike Reed,我正要说同样的话。我为Andrey Yazu修复了它。是的,我通常用awk处理结果,所以我忘记了tab。谢谢你的修复。
-a
在这里没用!另请参见我的简明Perl解决方案的答案是的,'-a'是我刚刚研究的另一个解决方案的副本。谢谢你的接球!简洁大方;我喜欢它——几乎和sed一样喜欢它。:)@池上:很高兴在这里见到你!我们已经很久没有在下午了:-)谢谢。我设法缩短了4个字符;我也想到了你的解决方案,但我认为它不再是一行。我不认为用文字换行符替换
\n
所节省的一个字符是有用的。:)但是高尔夫球打得很好,@ikegami@sid_com,很好的捕获:)[谁说的一行代码?如果它可以放入任何可以放置真正一行版本的shell命令中,它真的不再是一行代码了吗?]更短:
awk'{getline a;print$0,a}'文件