我有多个.txt文件,并希望根据它们的第一列(数字)将它们合并在一起,如果有任何丢失的数据,则填写"NULL“。
File_1:
1 a
2 b
3 cFile_2:
3 c
4 d
5 eFile_3:
4 d
5 e
6 fExpected_Output:
1 a NULL NULL
2 b NULL NULL
3 c c NULL
4 NULL d d
5 NULL e e
6 NULL NULL fjoin -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“,知道如何修复它吗?还有更好的方法来合并多个文件,而不是编写超长管道命令吗?
发布于 2019-08-22 08:07:04
你快到了。利用你的命令,我们得到:
$ 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而不是D7和D8,条件是对于每个文件,所有行最多都有与第一个行相同的字段数。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而不是D7和D8,条件是对于每个文件,所有行最多都有与第一个行相同的字段数。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而不是D7和D8,条件是对于每个文件,所有行最多都有与第一个行相同的字段数。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而不是D7和D8,条件是对于每个文件,所有行最多都有与第一个行相同的字段数。C9 D10:
J111
D12如果指定了关键字D13,则从每个文件的第一行推断输出格式。这与默认的输出格式相同,但也确保每一行输出的字段数相同。缺失字段将被替换为D14选项,而其他字段将被丢弃。
J215
发布于 2019-08-22 09:31:56
扩展从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 fhttps://unix.stackexchange.com/questions/536783
复制相似问题