【问题标题】:Removing double new lines using awk/sed使用 awk/sed 删除双新行
【发布时间】:2011-05-11 08:20:59
【问题描述】:

大家好。 我有一个充满数据的文件,每一行都包含类似于“755545;45634;1244”的内容。有时某处可能会出现未知数量的额外新行,这是我不想要的。 示例:

256163;16816;1651
16156;165165;1165

15153;135135;15351
15153;1351;8



165;15313;153513
254;45;45

期望的输出:

256163;16816;1651
16156;165165;1165    
15153;135135;15351
15153;1351;8
165;15313;153513
254;45;45

这可以用 unix 中的 awk/sed 实用程序轻松完成吗?

【问题讨论】:

    标签: file unix sed


    【解决方案1】:

    sed '/^$/d'

    【讨论】:

    • 谢谢回复。我试过了,但似乎它添加了一个额外的新行而不是删除它们..
    • 好吧,我现在正在尝试它,它可以工作。然后我假设您没有空行,而是其他内容(可能是制表符,空格?)。找个小测试文件试试看。
    • 嗯,这很有趣。我用我的例子及其工作进行了尝试。但我将它应用到它看起来不起作用的主文件上。可能是因为文件大小(大约 250Mb 的纯文本!)。
    • 不,我不这么认为。看看空行是什么。如果您在 unix 机器下,请制作一个八进制 dumo (od ) 以查看它是否为空行。将其与您的测试文件进行比较
    • 查看空行中的内容。如果您在 unix 机器下,请制作一个八进制 dumo (od ) 以查看它是否为空行。将其与您的测试文件进行比较。
    【解决方案2】:

    如果“空”行上没有空格,@Luixv 的答案是正确的。 如果存在空格,请改用:

    sed '/^[ \t]*$/d'
    

    那是括号内\t前的一个空格,即[space\t]

    如果这不起作用,则可能是换行有问题。做一个:

    $ file test_file
    test_file: ISO-8859 text, with CRLF, LF line terminators
    

    如果您得到上面的输出,请使用以下命令将文件转换为 unix:

    $ dos2unix test_file
    

    【讨论】:

    • 是的,是的!伟大的!确切地。之后完全工作,谢谢!
    • 如果您使用来自 Windows 的文件,也要小心。如果是这样,您可能需要匹配 ^M(额外的窗口结束符)以及空格和制表符。
    【解决方案3】:
    sed -nre "s/([^$])/\1/p" input
    

    【讨论】:

      【解决方案4】:

      ssedsuper_sed 解决,如果你没有安装它,安装它。

      ssed -R -e '/(^$|\s)/ d' yourFile
      

      cat yourFile| ssed -R -e '/(^$|\s)/ d'
      

      快乐的seding

      PS:即使您有标签或 \r \t \n 也可以工作,因此 ReqExp 中的 \s

      \r = Return Carriage
      \n = New Line
      \t = Tab
      

      【讨论】:

        【解决方案5】:
        sed -n 's/^[ ,\t]*$/!p' filename
        

        【讨论】:

        • 由于 unix 将空格和制表符视为不同的字符,我想我们应该同时提及
        • (修复了 tab 转义。转义使用退格。这里的前向空格可能不是预期的。我猜这是一个错字。)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-27
        • 2023-03-05
        • 2015-02-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多