加入整个字段而不是字段的第一位数字

Join on whole field instead of first digit of field

我有 file1.csv 看起来像这样:

99495
123346
1132013

和 file2.csv 看起来像这样:

99495,141
99495,138
123346,1

两个文件都使用以下方法排序:

sort -t, -k1n file1_unsorted.csv > file1.csv
sort -t, -k1n file2_unsorted.csv > file2.csv

我也尝试使用 -k1g 进行排序,但最终结果没有区别。

当我在两个 CSV 的第一个字段中加入两者时,

join -t, -o 2.1 2.2 -1 1 -2 1 file1.csv file2.csv > joined.csv

我收到错误:

join: file1.csv:2: is not sorted: 123346
join: file2.csv:3: is not sorted: 123346,1

对我来说,这似乎是 'sort' 程序按 字段 排序的问题,而 'join' 程序在检查排序时尝试加入第。由于 1 小于 9,因此表示数字未排序。我猜想用 0 填充数字会起作用,但我不想那样做。我希望能够加入以识别整个领域已经完成排序。

请注意,当我尝试上面的最小工作示例时,即使 sort -c 抛出错误,连接也确实发生了。但是当我在我的(大型)实际数据集上尝试它时,我得到了上面 post 的错误。

我在 Windows 10.

Ubuntu WSL 上使用 8.28 版本的连接和排序

首先你需要将文件按字典顺序排序为join,然后在加入后按数字sort排序:

join -t, <(sort -b unsorted1.csv) <(sort -b unsorted2.csv) | LC_ALL=C sort -n

LC_ALL=C 可能是必需的,因为 , 在某些语言环境中用作小数点字符,而在其他语言环境中可能用作数字分组字符。