【问题标题】:Bash merge file linesBash 合并文件行
【发布时间】:2020-07-04 11:38:33
【问题描述】:

我有一个保存测试输出的文件。

test 1  
42  
test 2  
69  
test 3  
420  
test 4  
55378008  

我想让测试输出与测试名称出现在同一行。像这样:

test 1:    42  
test 2:    69  
test 3:    420  
test 4:    55378008  

我确信有一些花哨的 sedawkperl 方法可以做到这一点,但我被卡住了。

【问题讨论】:

  • 文件不是双倍行距!
  • 你是对的,标题具有误导性。我认为“合并文件行”可能是一个更好的标题
  • 这不仅仅是(旧的)标题,它也是“我知道 sed G 如何使文件加倍空间,我希望 sed G 命令可能反转以取消加倍空间文件”真的与你想要做什么无关。

标签: bash awk sed


【解决方案1】:

这是另一个 sed 风格的产品来完成报价:

sed 'N ; s/\n/: /' input_file

对于从第一行开始的每一行(奇数行),将下一个(偶数)行附加到由 LF 分隔的模式空间中,然后将该 LF 替换为 :

【讨论】:

    【解决方案2】:
    awk 'FNR%2{printf "%s: ", $0; next}1' file
    

    这将打印带有后缀 : 且不带换行符的奇数行,以及带有换行符的偶数行。

    【讨论】:

      【解决方案3】:

      pr 具有此内置功能,但如果您也需要调整空白,那么其他答案中建议的sed/awk/perl 解决方案将更适合您

      $ pr -2ats': ' ip.txt 
      test 1: 42
      test 2: 69
      test 3: 420
      test 4: 55378008
      

      这一次合并 2 行,以 : 作为分隔符。

      【讨论】:

        【解决方案4】:

        只需将奇数行的换行替换为:␠即可。

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

        您提到您还想删除前导和尾随空格。为此,您可以使用以下内容:

        perl -pe's/^\h+|\h+$/g; s/\n/: / if $. % 2'
        

        Specifying file to process to Perl one-liner

        【讨论】:

        • 我喜欢 \h+ 只删除水平空格。还有 \N 字符类表示不是换行符。
        • @brian d foy,很好的建议
        【解决方案5】:

        一个 shell 解决方案,在大量数据/文件上使用 very slow

        while IFS= read -r odd_line; do
          IFS= read -r even_line
          printf '%s: %s\n' "$odd_line" "$even_line"
        done < file.txt
        

        另一方面,如果冒号不是必需的,paste 可以完成这项工作。

        paste - - < file.txt
        

        【讨论】:

        • paste -d : - - &lt; file
        • 对,但它不创建空间。介于两者之间。至少在我这边。
        【解决方案6】:

        Bash 解决方案

        跳过空行

        同时处理 UNIX/DOS 格式的“行尾”

        接受文件名作为参数或从 STDIN 读取数据

        #!/bin/bash
        
        while read p1
        do
          [[ -z $p1 ]] && continue
          # p1=`echo -n $p1 | tr -d "\r"`  # replaced with following line
          p1=${p1//$'\r'/}
          read p2
          echo -n "$p1: $p2"
        done < ${1:-/dev/stdin}
        

        输出

        test 1: 42
        test 2: 69
        test 3: 420
        test 4: 55378008
        

        注意:连接行之间不允许有空行

        【讨论】:

        • 你可以试试p1=${p1//$'\r'/}
        • @Jetchisel -- 嗯,它确实有效。你能告诉我这个“建筑”记录在哪里吗?我以前从未见过。
        • 参数扩展和$' ' 是 bash 特定的 shell 引用。
        • @Jetchisel -- 谢谢,现在的问题是如何记住这个结构或者我在哪里可以找到它。这是一个很好的功能,在某些情况下非常有用。我将更改我的答案以使用您的方法 - 至少它将成为未来的参考。
        • @Jetchisel -- 好的,我发现这个结构在哪里described
        猜你喜欢
        • 1970-01-01
        • 2012-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-13
        • 2013-07-23
        • 1970-01-01
        • 2019-06-25
        相关资源
        最近更新 更多