首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >连接多个文件

连接多个文件
EN

Unix & Linux用户
提问于 2019-08-22 06:41:24
回答 2查看 407关注 0票数 4

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

File_1:

代码语言:javascript
复制
1 a
2 b
3 c

File_2:

代码语言:javascript
复制
3 c
4 d
5 e

File_3:

代码语言:javascript
复制
4 d
5 e
6 f

Expected_Output:

代码语言:javascript
复制
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 这个命令为我提供了第1、2和3列的正确输出;但是,在第4列中缺少"NULL“,知道如何修复它吗?还有更好的方法来合并多个文件,而不是编写超长管道命令吗?

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

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2019-08-22 08:07:04

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

代码语言:javascript
复制
$ join -t 行没有相同数量的列,因为我们没有为管道中的右侧join设置格式。如果我们将其添加为-o 0,1.2,1.3,2.2 ( join字段+来自第一个联接的第二和第三列+file_3的第二列):$ join -t 最后,如果我们可以假设join的GNU实现,我们可以让它推断出正确的格式,并使用-o auto而不是-o 0,1.2,2.2和-o 0,1.2,1.3,2.2,条件是对于每个文件,所有行最多都有与第一个行相同的字段数。引文 info join:-o auto如果指定了关键字auto,则从每个文件的第一行推断输出格式。这与默认的输出格式相同,但也确保每一行输出的字段数相同。缺失字段将被替换为-e选项,而其他字段将被丢弃。\t' -a 1 -a 2 -1 1 -2 1 -e NULL -o 0,1.2,2.2 file_1 file_2 | join -t 行没有相同数量的列,因为我们没有为管道中的右侧D1设置格式。如果我们将其添加为D2 ( join字段+来自第一个联接的第二和第三列+D3的第二列):A4最后,如果我们可以假设D5的GNU实现,我们可以让它推断出正确的格式,并使用D6而不是D7和D8,条件是对于每个文件,所有行最多都有与第一个行相同的字段数。C9 D10:J111D12如果指定了关键字D13,则从每个文件的第一行推断输出格式。这与默认的输出格式相同,但也确保每一行输出的字段数相同。缺失字段将被替换为D14选项,而其他字段将被丢弃。J215\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行没有相同数量的列,因为我们没有为管道中的右侧D1设置格式。如果我们将其添加为D2 ( join字段+来自第一个联接的第二和第三列+D3的第二列):A4最后,如果我们可以假设D5的GNU实现,我们可以让它推断出正确的格式,并使用D6而不是D7和D8,条件是对于每个文件,所有行最多都有与第一个行相同的字段数。C9 D10:J111D12如果指定了关键字D13,则从每个文件的第一行推断输出格式。这与默认的输出格式相同,但也确保每一行输出的字段数相同。缺失字段将被替换为D14选项,而其他字段将被丢弃。J215\t' -a 1 -a 2 -1 1 -2 1 -e NULL -o 0,1.2,2.2 file_1 file_2 | join -t 最后,如果我们可以假设D5的GNU实现,我们可以让它推断出正确的格式,并使用D6而不是D7和D8,条件是对于每个文件,所有行最多都有与第一个行相同的字段数。C9 D10:J111D12如果指定了关键字D13,则从每个文件的第一行推断输出格式。这与默认的输出格式相同,但也确保每一行输出的字段数相同。缺失字段将被替换为D14选项,而其他字段将被丢弃。J215\t' -a 1 -a 2 -1 1 -2 1 -e NULL -o 0,1.2,2.2 file_1 file_2 | join -t 行没有相同数量的列,因为我们没有为管道中的右侧D1设置格式。如果我们将其添加为D2 ( join字段+来自第一个联接的第二和第三列+D3的第二列):A4最后,如果我们可以假设D5的GNU实现,我们可以让它推断出正确的格式,并使用D6而不是D7和D8,条件是对于每个文件,所有行最多都有与第一个行相同的字段数。C9 D10:J111D12如果指定了关键字D13,则从每个文件的第一行推断输出格式。这与默认的输出格式相同,但也确保每一行输出的字段数相同。缺失字段将被替换为D14选项,而其他字段将被丢弃。J215\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

行没有相同数量的列,因为我们没有为管道中的右侧D1设置格式。

如果我们将其添加为D2 ( join字段+来自第一个联接的第二和第三列+D3的第二列):

A4

最后,如果我们可以假设D5的GNU实现,我们可以让它推断出正确的格式,并使用D6而不是D7D8,条件是对于每个文件,所有行最多都有与第一个行相同的字段数。C9 D10

J111

D12如果指定了关键字D13,则从每个文件的第一行推断输出格式。这与默认的输出格式相同,但也确保每一行输出的字段数相同。缺失字段将被替换为D14选项,而其他字段将被丢弃。

J215\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

最后,如果我们可以假设D5的GNU实现,我们可以让它推断出正确的格式,并使用D6而不是D7D8,条件是对于每个文件,所有行最多都有与第一个行相同的字段数。C9 D10

J111

D12如果指定了关键字D13,则从每个文件的第一行推断输出格式。这与默认的输出格式相同,但也确保每一行输出的字段数相同。缺失字段将被替换为D14选项,而其他字段将被丢弃。

J215\t' -a 1 -a 2 -1 1 -2 1 -e NULL -o 0,1.2,2.2 file_1 file_2 | join -t

行没有相同数量的列,因为我们没有为管道中的右侧D1设置格式。

如果我们将其添加为D2 ( join字段+来自第一个联接的第二和第三列+D3的第二列):

A4

最后,如果我们可以假设D5的GNU实现,我们可以让它推断出正确的格式,并使用D6而不是D7D8,条件是对于每个文件,所有行最多都有与第一个行相同的字段数。C9 D10

J111

D12如果指定了关键字D13,则从每个文件的第一行推断输出格式。这与默认的输出格式相同,但也确保每一行输出的字段数相同。缺失字段将被替换为D14选项,而其他字段将被丢弃。

J215\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

行没有相同数量的列,因为我们没有为管道中的右侧D1设置格式。

如果我们将其添加为D2 ( join字段+来自第一个联接的第二和第三列+D3的第二列):

A4

最后,如果我们可以假设D5的GNU实现,我们可以让它推断出正确的格式,并使用D6而不是D7D8,条件是对于每个文件,所有行最多都有与第一个行相同的字段数。C9 D10

J111

D12如果指定了关键字D13,则从每个文件的第一行推断输出格式。这与默认的输出格式相同,但也确保每一行输出的字段数相同。缺失字段将被替换为D14选项,而其他字段将被丢弃。

J215

票数 2
EN

Unix & Linux用户

发布于 2019-08-22 09:31:56

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

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

代码语言:javascript
复制
#!/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"

结果:

代码语言:javascript
复制
$ . 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
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/536783

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档