【问题标题】:How to interleave lines from two text files如何交错来自两个文本文件的行
【发布时间】:2011-04-30 00:50:59
【问题描述】:

交错两个(或多个)文本文件的行的最简单/最快的方法是什么?示例:

文件 1:

line1.1
line1.2
line1.3

文件 2:

line2.1
line2.2
line2.3

交错:

line1.1
line2.1
line1.2
line2.2
line1.3
line2.3

当然,编写一个打开它们并完成任务的小 Perl 脚本很容易。但我想知道是否有可能用更少的代码摆脱困境,也许是使用 Unix 工具的单行代码?

【问题讨论】:

    标签: unix command


    【解决方案1】:
    paste -d '\n' file1 file2
    

    【讨论】:

    • 注:在某些平台上paste 相当有限 - 例如在 Solaris 上,您最多可以有 12 个输入文件,并且输出行限制为 511 个字符。
    • 然后在paste -d '\n' <(find /) <(find /) 之类的示例中将其与进程替换一起使用,并意识到这比首先以各种方式将结果写入文件要好得多,磁盘使用情况,内存使用情况,并行化,可取消性...
    • 哇,paste!回到 1979 年,AT&T UNIX 32v。干得好,先生。
    • 哇,一个非常简洁的解决方案!
    【解决方案2】:
    cat file1 file2 |sort -t. -k 2.1
    

    这里它指定分隔符是“。”并且我们正在对第二个字段的第一个字符进行排序。

    【讨论】:

    • 我不明白这是如何工作的。例如,排序输入中没有冒号?你能解释更多吗?
    • 我的错,将 ':' 更改为 '.'它只是分隔符,如果未指定排序使用空白来分隔字段。 man sort 了解更多信息。
    • 此答案假定输入实际上采用问题中描述的文字形式。我认为这应该是说明性的。以这种方式转换每个输入文件是可能的,但它会更多地通过数据。 codaddict 的回答更好。
    • @Novelocrat:是的,这只是另一种方式:)
    【解决方案3】:

    这是一种 GUI 方法:将它们粘贴到电子表格的两列中,复制所有单元格,然后使用正则表达式将制表符替换为换行符。

    【讨论】:

      【解决方案4】:

      这是使用awk的解决方案:

      awk '{print; if(getline < "file2") print}' file1
      

      产生这个输出:

      line 1 from file1
      line 1 from file2
      line 2 from file1
      line 2 from file2
      ...etc
      

      如果你想在输出中添加一些额外的格式,使用awk 会很有用,例如,如果你想根据每一行来自哪个文件来标记每一行:

      awk '{print "1: "$0; if(getline < "file2") print "2: "$0}' file1
      

      产生这个输出:

      1: line 1 from file1
      2: line 1 from file2
      1: line 2 from file1
      2: line 2 from file2
      ...etc
      

      注意:此代码假定 file1 的长度大于或等于 file2。

      如果 file1 包含的行多于 file2 并且您想在 file2 完成后为它输出空行,请在 getline 测试中添加 else 子句:

      awk '{print; if(getline < "file2") print; else print ""}' file1
      

      awk '{print "1: "$0; if(getline < "file2") print "2: "$0; else print"2: "}' file1
      

      【讨论】:

        【解决方案5】:

        @Sujoy's answer 指向一个有用的方向。您可以添加行号、排序和去除行号:

        (cat -n file1 ; cat -n file2 )  | sort -n  | cut -f2-
        

        注意(我感兴趣)如果您使用运行速度可能比另一个慢或快的命令的输出而不是静态文件,则需要做更多的工作才能正确排序。在这种情况下,除了行号之外,您还需要添加/排序/删除另一个标签:

        (cat -n <(command1...) | sed 's/^/1\t/' ; cat -n <(command2...) | sed 's/^/2\t/' ; cat -n <(command3) | sed 's/^/3\t/' )  \
           | sort -n  | cut -f2- | sort -n | cut -f2-
        

        【讨论】:

          【解决方案6】:

          使用 GNU sed:

          sed 'R file2' file1
          

          输出:

          线1.1 线2.1 线1.2 线2.2 线1.3 线2.3

          【讨论】:

            猜你喜欢
            • 2018-02-08
            • 1970-01-01
            • 2022-08-14
            • 1970-01-01
            • 2013-07-23
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多