AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 536783
Accepted
user368151
user368151
Asked: 2019-08-22 22:41:24 +0800 CST2019-08-22 22:41:24 +0800 CST 2019-08-22 22:41:24 +0800 CST

加入多个文件

  • 772

我有多个 .txt 文件,并希望根据它们的第一列(数字)将它们合并在一起,如果有任何丢失的数据,请填写“NULL”。

文件_1:

1 a
2 b
3 c

文件_2:

3 c
4 d
5 e

文件_3:

4 d
5 e
6 f

预期输出:

1 a NULL NULL
2 b NULL NULL
3 c c NULL
4 NULL d d
5 NULL e e
6 NULL NULL f

join -t $'\t' -a 1 -a 2 -1 1 -2 1 -e NULL -o 0,1.2,2.2 file_1 file_2 | join -t $'\t' -a 1 -a 2 -1 1 -2 1 -e NULL - file_3 > expected_output该命令为我提供了第 1、2 和 3 列的正确输出;但是,第 4 列中缺少“NULL”,知道如何解决吗?还有没有更好的方法来合并多个文件而不是编写超长管道命令?

text-processing join
  • 2 2 个回答
  • 357 Views

2 个回答

  • Voted
  1. markgraf
    2019-08-23T01:31:56+08:002019-08-23T01:31:56+08:00

    扩展从https://stackoverflow.com/a/13963634和fra-san学到的东西

    这适用于任意数量的文件。

    #!/bin/bash
    tempdir=$(mktemp --directory)
    trap "rm -r $tempdir" EXIT SIGTERM
    
    for infile in "$@"; do
      sort "$infile" > "${tempdir}/${infile}.sorted"
      if [ -e "${tempdir}/final.results" ]
      then
        join -a1 -a2 -e "NULL" -o auto \
          "${tempdir}/final.results" "${tempdir}/${infile}.sorted" \
          > "${tempdir}/res"
        mv "${tempdir}/res" "${tempdir}/final.results"
      else
        cp "${tempdir}/${infile}.sorted" "${tempdir}/final.results"
      fi
    done
    cat "${tempdir}/final.results"
    

    结果:

    $ . join_multiple_files.sh file* | column -t
    1  a     NULL  NULL
    2  b     NULL  NULL
    3  c     c     NULL
    4  NULL  d     d
    5  NULL  e     e
    6  NULL  NULL  f
    
    • 3
  2. Best Answer
    fra-san
    2019-08-23T00:07:04+08:002019-08-23T00:07:04+08:00

    你快到了。使用您的命令,我们得到:

    $ join -t $'\t' -a 1 -a 2 -1 1 -2 1 -e NULL -o 0,1.2,2.2 file_1 file_2 | join -t $'\t' -a 1 -a 2 -1 1 -2 1 -e NULL - file_3
    1       a       NULL
    2       b       NULL
    3       c       c
    4       NULL    d       d
    5       NULL    e       e
    6       f
    

    行只是没有相同数量的列,因为我们没有为join管道中的右手设置格式。

    如果我们将其添加为-o 0,1.2,1.3,2.2(连接字段 + 第一个连接的第二和第三列 + 的第二列file_3):

    $ join -t $'\t' -a 1 -a 2 -1 1 -2 1 -e NULL -o 0,1.2,2.2 file_1 file_2 | join -t $'\t' -a 1 -a 2 -1 1 -2 1 -e NULL -o 0,1.2,1.3,2.2 - file_3
    1       a       NULL    NULL
    2       b       NULL    NULL
    3       c       c       NULL
    4       NULL    d       d
    5       NULL    e       e
    6       NULL    NULL    f
    

    最后,如果我们可以假设 的 GNU 实现join,我们可以让它完成推断正确格式的工作,并使用-o auto而不是-o 0,1.2,2.2and -o 0,1.2,1.3,2.2,前提是对于每个文件,所有行最多具有与第一个相同数量的字段. 报价 info join:

    -o auto
    如果指定了关键字auto,则从每个文件的第一行推断输出格式。这与默认输出格式相同,但也确保每行输出相同数量的字段。缺少的字段被替换为-e选项,多余的字段被丢弃。

    • 2

相关问题

  • grep 从 $START 到 $END 的一组行并且在 $MIDDLE 中包含匹配项

  • 重新排列字母并比较两个单词

  • 在awk中的两行之间减去相同的列

  • 多行文件洗牌

  • 如何更改字符大小写(从小到大,反之亦然)?同时[重复]

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve