Ale*_*rev 3 unix linux bash shell join
如果我想join在我的 Ubuntu上使用,我需要首先按字典顺序对两个文件进行排序(根据join --help),然后才加入它们:
tail -n +2 meta/201508_1 | sort -k 1b,1 > meta.txt
tail -n +2 keywords/copy | sort -k 1b,1 > keywords.txt
join meta.txt keywords.txt -1 1 -2 1 -t $'\t'
Run Code Online (Sandbox Code Playgroud)
(我还使用从他们两个中删除标题tail)
但不是按字典顺序对文件进行排序,我想按数字对它们进行排序:两个文件中的第一列都是一个 ID。
tail -n +2 meta/201508_1 | sort -k1 -n > meta.txt
tail -n +2 keywords/copy.txt | sort -k1 -n > keywords.txt
Run Code Online (Sandbox Code Playgroud)
然后加入。但是对于join这些文件看起来未排序:
join: meta.txt:10: is not sorted: 1023 301000 en
join: keywords.txt:2: is not sorted: 10 keyword1
Run Code Online (Sandbox Code Playgroud)
如果我添加--nocheck-order到join,它不会正确连接 - 它只输出一行。
如何在 bash 中以数字 ID 连接两个文件?
示例(列以制表符分隔):
文件 1
id volume lang
1 10 en
2 20 en
5 30 en
6 40 en
10 50 en
Run Code Online (Sandbox Code Playgroud)
档案 2
id keyword
4 kw1
2 kw2
10 kw3
1 kw4
3 kw5
Run Code Online (Sandbox Code Playgroud)
期望的输出
1 kw4 10 en
2 kw2 20 en
10 kw3 50 en
Run Code Online (Sandbox Code Playgroud)
这两个都有效。第一个(sort -b被推荐在Mac上)
join <(sed 1d file1 | sort -b) <(sed 1d file2 | sort -b) | sort -n
Run Code Online (Sandbox Code Playgroud)
在Linux手册页建议sort -k 1b,1
join <(sed 1d file1 | sort -k 1b,1) <(sed 1d file2 | sort -k 1b,1) | sort -n
Run Code Online (Sandbox Code Playgroud)
无论如何,您需要按字典顺序对它们进行排序以加入它们。最后,您仍然可以按数字对结果进行排序。