Bash:按数字列连接

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-orderjoin,它不会正确连接 - 它只输出一行。

如何在 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)

Joh*_*iss 5

这两个都有效。第一个(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)

无论如何,您需要按字典顺序对它们进行排序以加入它们。最后,您仍然可以按数字对结果进行排序。