【问题标题】:Putting Two Consecutive Lines into One Line with Perl / AWK使用 Perl / AWK 将两行连续合并为一行
【发布时间】:2012-04-30 12:16:23
【问题描述】:

我有如下数据:

abcd
join abcd
efgh
join efgh

我想将两个连续的对连接成一行。 结果:

abcd join abcd
efgh join efgh

如何在 Perl/AWK 中做到这一点?

【问题讨论】:

  • 你的输出随着你的编辑而改变——第一个没有额外的空间,第二个确实有额外的空间。另外,join 本身在数据中是明确的还是只是一个不幸的巧合?

标签: linux perl unix text awk


【解决方案1】:
$ sed 'N;s/\n/ /' input.txt
abcd join abcd
efgh join efgh

【讨论】:

  • 我比我更喜欢这个。
  • 这是如何工作的?我可以从 sed 手册中看到 N 命令将输入​​附加到模式空间和 ;似乎是一个命令分隔符。打印是如何每隔一行发生的?
  • 无法理解它是如何工作的,你能解释一下吗? :)
【解决方案2】:

最简单的方法是:

paste - - < FILE

这使用空格而不是制表符连接:

paste -d" " - - < FILE

【讨论】:

  • 好,除了插入标签; paste -d" " - - 更好地匹配所需的输出。而且您不需要cat 管道,只需paste -d" " - - &lt; FILE
  • @Mike Reed,我正要说同样的话。我为 Andrey Yazu 修复了它。
  • 是的,我通常用 awk 处理结果,所以我忘记了 tab。感谢您修复。
【解决方案3】:

Perl:

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

高尔夫挑战:将上述内容缩短 5 个字符。

高尔夫挑战解决方案:

perl -pe'$.%2&&s/
/ /' file

【讨论】:

  • 简洁明了;我喜欢它——几乎和 sed 一样多。 :)
  • @ikegami:很高兴在这里见到你!自从我们在 PM 工作以来已经很长时间了 :-)
  • 谢谢。我设法缩短了 4 个字符;我也想到了你的解决方案,但我认为它不再是单线了。
  • 我不认为将\n 替换为文字换行符所节省的一个字符是有用的。 :) 但是打高尔夫球很好,@ikegami!
  • @sid_com,那么很好:) [谁说单线?如果它可以放入几乎任何可以放置真正单行版本的 shell 命令中,它真的不再是单行版本了吗?]
【解决方案4】:
cat input | paste -sd' \n'

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

【讨论】:

    【解决方案5】:

    我的第一直觉:

    perl -lne 'if ($. % 2) { $last = $_; } else { print "$last $_" }'
    

    受@kev 的 sed 解决方案启发的更简洁的版本:

    perl -lpe '$_ .= " " . <>; chomp'
    

    但我认为 sed 赢了这一轮。

    【讨论】:

    • -a 在这里没用!另请参阅我对简洁 Perl 解决方案的回答
    • 是的,'-a' 是我刚刚处理列的另一个解决方案的复制粘贴。谢谢你的收获!
    【解决方案6】:
    awk '{getline a; printf "%-s\n", $0 " " a}' file 
    

    【讨论】:

    • 短:awk '{getline a; print $0, a}' file
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    • 2017-05-14
    • 1970-01-01
    • 2015-02-08
    • 1970-01-01
    相关资源
    最近更新 更多