问题描述
我有如下所示的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”程序按 field 排序似乎是一个问题,而“ join”程序尝试在检查第一个 digit 上的排序时尝试加入。由于1小于9,因此表示数字未排序。我猜想用0填充数字会起作用,但是我不想这样做。我希望能够加入进来,以认识到排序是由整个字段完成的。
请注意,当我尝试上述最小工作示例时,即使sort -c引发错误,也确实发生了连接。但是,当我在(大型)实际数据集上进行尝试时,我得到了上面发布的错误。
我在Windows 10的Ubuntu WSL上同时使用join和sort的8.28版本。
解决方法
首先,您需要按字母顺序对文件进行排序,以join
对其进行排序,然后在加入后按数字sort
进行排序:
join -t,<(sort -b unsorted1.csv) <(sort -b unsorted2.csv) | LC_ALL=C sort -n
由于LC_ALL=C
在某些语言环境中用作小数点字符,而在其他语言环境中可用作数字分组字符,因此,
可能是必需的。