Linux排序 - 帮助通缉

时间:2014-03-13 12:11:07

标签: linux bash sorting csv

我已经陷入困境几天了。也许你的大脑比我大!

我收到了一堆CSV文件,我希望它们连接成一个.csv文件,数字排序。好的,首先遇到的问题是ID(我想按ID排序)名称。 例如

sort -f *.csv > output.csv如果我有id001,id002,id010,id100等标准ID,这将有效 但我的id就像id1,id2,id10,id100,这使我的排序工作不准确。

确定

sort -t, -V *.csv > output.csv - 这在我的测试机器上完美运行(sort --version GNU coreutils 8.5.0),但我的工作机器获得了5.3.0排序版本(并且他们没有实现 - V语法就可以了)我无法更新它!

我觉得这样的不幸和不幸 如果你有更好的主意,请带上它。

我的csv文件看起来像

cn41    AQ34070YTW  CDEAQ34070YTW   9C:B6:54:08:A3:C6   9C:B6:54:08:A3:C4        
cn42    AQ34070YTY  CDEAQ34070YTY   9C:B6:54:08:A4:22   9C:B6:54:08:A4:20        
cn43    AQ34070YV1  CDEAQ34070YV1   9C:B6:54:08:9F:0E   9C:B6:54:08:9F:0C        
cn44    AQ34070YV3  CDEAQ34070YV3   9C:B6:54:08:A3:7A   9C:B6:54:08:A3:78        
cn45    AQ34070YW7  CDEAQ34070YW7   9C:B6:54:08:25:22   9C:B6:54:08:25:20

这实际上是来自csv的复制/粘贴。所以,让我们说,这是我的第一个CSV。而另一个看起来像

cn201   AQ34070YTW  CDEAQ34070YTW   9C:B6:54:08:A3:C6   9C:B6:54:08:A3:C4    
cn202   AQ34070YTY  CDEAQ34070YTY   9C:B6:54:08:A4:22   9C:B6:54:08:A4:20        
cn203   AQ34070YV1  CDEAQ34070YV1   9C:B6:54:08:9F:0E   9C:B6:54:08:9F:0C        
cn204   AQ34070YV3  CDEAQ34070YV3   9C:B6:54:08:A3:7A   9C:B6:54:08:A3:78        
cn205   AQ34070YW7  CDEAQ34070YW7   9C:B6:54:08:25:22   9C:B6:54:08:25:20        

期待您的阅读!

此致

3 个答案:

答案 0 :(得分:1)

您可以使用从-kX.Y字符开始的XY,以及-n的数据:

sort -t, -k2.3 -n *csv

根据您的示例文件,它会生成:

$ sort -t, -k2.3 -n file
,id1,aaaaaa,bbbbbbbbbb,cccccccccccc,ddddddd
,id2,aaaaaa,bbbbbbbbbb,cccccccccccc,ddddddd
,id10,aaaaaa,bbbbbbbbbb,cccccccccccc,ddddddd
,id40,aaaaaa,bbbbbbbbbb,cccccccccccc,ddddddd
,id101,aaaaaa,bbbbbbbbbb,cccccccccccc,ddddddd
,id201,aaaaaaaaa,bbbbbbbbbb,ccccccccccc,ddddddd

更新

对于您的输入,我会这样做:

$ cat *csv | sort -k1.3 -n
cn41    AQ34070YTW  CDEAQ34070YTW   9C:B6:54:08:A3:C6   9C:B6:54:08:A3:C4        
cn42    AQ34070YTY  CDEAQ34070YTY   9C:B6:54:08:A4:22   9C:B6:54:08:A4:20        
cn43    AQ34070YV1  CDEAQ34070YV1   9C:B6:54:08:9F:0E   9C:B6:54:08:9F:0C        
cn44    AQ34070YV3  CDEAQ34070YV3   9C:B6:54:08:A3:7A   9C:B6:54:08:A3:78        
cn45    AQ34070YW7  CDEAQ34070YW7   9C:B6:54:08:25:22   9C:B6:54:08:25:20
cn201   AQ34070YTW  CDEAQ34070YTW   9C:B6:54:08:A3:C6   9C:B6:54:08:A3:C4    
cn202   AQ34070YTY  CDEAQ34070YTY   9C:B6:54:08:A4:22   9C:B6:54:08:A4:20        
cn203   AQ34070YV1  CDEAQ34070YV1   9C:B6:54:08:9F:0E   9C:B6:54:08:9F:0C        
cn204   AQ34070YV3  CDEAQ34070YV3   9C:B6:54:08:A3:7A   9C:B6:54:08:A3:78        
cn205   AQ34070YW7  CDEAQ34070YW7   9C:B6:54:08:25:22   9C:B6:54:08:25:20 

答案 1 :(得分:1)

如果你的CSV格式是固定的,你可以使用decorate-sort-undecorate模式的shell等价物:

cat *.csv | sed 's/^,id//' | sort -n | sed 's/^/,id/' >output.csv

即使在古代版-n中也存在sort选项。

更新:更新后的输入包含一个带有不同前缀的数字,并且位于该行的不同位置。这是一个处理两种输入的版本,以及在行中某处有数字的其他输入,按第一个数字排序:

cat *.csv | sed 's/^\([^0-9]*\)\([0-9][0-9]*\)/\2 \1\2/' \
          | sort -n \
          | sed 's/^[^ ]* //' > output.csv

答案 2 :(得分:0)

您可以尝试-g选项:
sort -t, -k 2.3 -g fileName

-t分隔符
-k键/列
-g通用数字排序