是否有一些解决方法可以根据第一列一次加入多个文件?通常,我会这样做:
join File1 File2 > File1+File2
和File1+File2 File3 > final_output
示例文件:
文件1:
1 test1
2 test3
3 test4
4 test5
7 test7
文件2:
1 example1
2 example2
3 example3
4 example4
8 example8
文件3:
1 foo1
2 foo2
3 foo3
4 foo4
10 foo10
考虑到每个文件中第五行可能有所不同,并且n
文件数量较多。
编辑:
输出示例:
1 test1 example1 foo1
2 test2 example2 foo2
3 test3 example3 foo3
4 test4 example4 foo4
另一方面,我不确定如何处理第 1 列中不匹配的行(第五行)谢谢
答案1
基本上就像你的 3 个文件示例一样
$ join file2 file3| join file1 -
1 test1 example1 foo1
2 test3 example2 foo2
3 test4 example3 foo3
4 test5 example4 foo4
但重要的是您的所有输入文件必须已经排序(sort -k 1b,1
像您的示例一样的数字排序可能不起作用!)。因此上面的动态排序示例可以bash
这样写:
join <(sort -k 1b,1 file2) <(sort -k 1b,1 file3) | join <(sort -k 1b,1 file1) -\
| sort -k 1n,1
最后是使用递归函数的 n 个文件的一般情况(在 中测试bash
):
xjoin() {
local f
local srt="sort -k 1b,1"
if [ "$#" -lt 2 ]; then
echo "xjoin: need at least 2 files" >&2
return 1
elif [ "$#" -lt 3 ]; then
join <($srt "$1") <($srt "$2")
else
f=$1
shift
join <($srt "$f") <(xjoin "$@")
fi
}
xjoin file1 file2 file3 | sort -k 1n,1
如果您知道自己在做什么,则可以省略排序管道。但根据我的经验,join
没有明确说明sort
往往会导致麻烦。