【问题标题】:Join Merge only the first two lines of a file using AWK or SED使用 AWK 或 SED 仅合并文件的前两行
【发布时间】:2015-02-21 06:14:15
【问题描述】:

我有一个这样的文件

Line1
Line2
Line3
Line4
Line5

我需要这样的输出:

Line1Line2
Line3
Line4
Line5

我尝试了 sed ":a;N;$!ba;s/\n//g" asd.txt,但它将所有行合二为一。

【问题讨论】:

  • 你正在改变所有的行,只需像这样sed ":a;1N;$!ba;s/\n//g" asd.txt指定第一行。

标签: join awk sed merge lines


【解决方案1】:

使用sed,您可以将操作限制为specific line number。在这种情况下,我们将追加(到模式空间)和替换限制在第 1 行:

sed '1 {N; s/\n//}' file

请注意,此解决方案也可以不使用大括号:

sed '1N; s/\n//' file

但请注意,最后一种解决方案的可维护性稍差。这对你来说是否有问题是另一回事。无论哪种情况,结果都是:

Line1Line2
Line3
Line4
Line5

【讨论】:

  • 这个答案是正确的。然而,经常会发生解决方案可能会被修改以应用新规范,并且 dangling s/\n// 可能会赶上粗心的人。出于这个原因,最好将这两个命令分组并将它们应用于地址。至少这会引起后面程序员的注意。
  • @potong:说得对,我已经更新了适合的解决方案。很难争论不包括大括号的情况,但由于解决方案会很短,所以我想我会缩短它。
【解决方案2】:
sed '1 {N;s/\n//}'

结果

Line1Line2
Line3
Line4
Line5

取第 1 行并添加下一行。然后删除换行符

【讨论】:

    【解决方案3】:

    一个 awk 解决方案就像

    $ awk '{ORS=(NR==1?"":"\n")}1 ' input
    Line1Line2
    Line3
    Line4
    Line5
    

    $ awk '{ORS=(NR==1?"":RS)}1 ' input
    Line1Line2
    Line3
    Line4
    Line5
    

    【讨论】:

    • ++ 用于将三元运算括起来。次要 nitpick - 您可以使用 RS 而不是 "\n" 来节省 2 个字符。
    • @jaypalsingh RS 是一个不错的选择。在答案中添加。谢谢你:)
    【解决方案4】:

    你可以试试下面的 sed 命令,

    $ sed 'N;0,/\n/s/\n//' file
    Line1Line2
    Line3
    Line4
    Line5
    

    N 将下一行附加到模式空间中。 0,/./(指定范围)仅有助于在第一次匹配时进行替换。 s/\n// 将第一个换行符替换为空字符串。

    【讨论】:

    • @AvinashRaj 也许有些人只是度过了糟糕的一天,而否决了好的答案。 (现在我可以说:圣诞快乐,有点晚或新年快乐,但早:D)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-11
    • 2012-02-10
    • 2015-02-20
    • 2012-01-01
    • 2015-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多