2009-06-24 83 views
134

我有以下格式的數據:Unix的排序與製表符分隔符

foo<tab>1.00<space>1.33<space>2.00<tab>3 

現在我試圖基於最後一個字段的遞減排序文件。 我試過下面的命令,但沒有按照我們的預期排序。

$ sort -k3nr file.txt # apparently this sort by space as delimiter 

$ sort -t"\t" -k3nr file.txt 
    sort: multi-character tab `\\t' 

$ sort -t "`/bin/echo '\t'`" -k3,3nr file.txt 
    sort: multi-character tab `\\t' 

什麼是正確的做法?

這裏是sample data

回答

242

使用慶典,這將這樣的伎倆:

$ sort -t$'\t' -k3 -nr file.txt 

請注意,在單引號字符串前的美元符號。您可以在ANSI-C Quoting sections of the bash man page中閱讀 。

+0

[使用](https://stackoverflow.com/a/1250279/4970442)```'「'`在別名中使用它。 – 2017-09-27 05:49:59

1

通過類似awk '{ print print $1"\t"$2"\t"$3"\t"$4"\t"$5 }'的管道。這會將空格更改爲製表符。

+0

@MB:我需要保持空間不變。 – neversaint 2009-06-24 10:00:27

+1

毫無疑問,這是一種更乾淨的方式,但是沒有什麼能夠阻止你通過awk進行管道操作,將空間更改爲製表符,對數據進行排序,然後再次通過awk對其進行管道化,將製表符重新改回空格。 – 2009-06-24 10:08:35

+1

如果您想要保留的製表符和空格混合在一起,這將不起作用。 – 2009-06-24 10:11:23

9

默認情況下,字段分隔符是非空白的空白轉換,所以選項卡應該工作得很好。

然而,列索引基部1和基數爲0,所以你可能想

sort -k4nr file.txt 

柱4位數字以相反的順序進行排序file.txt的。 (雖然在問題的數據甚至已經5場,因此最後一個字段是指數5)

+4

只有在所有輸入行中,製表符分隔字段之間的空格字符數相同時,這纔會起作用。 – 2009-06-24 10:23:47

1

一般保存數據,如這不是做,如果你能避免它一個偉大的事情,因爲人們總是困惑標籤和空間。

解決你的問題是一個腳本語言如Perl,Python或Ruby非常簡單。下面是一些示例代碼:

#!/usr/bin/perl -w 

use strict; 

my $sort_field = 2; 
my $split_regex = qr{\s+}; 

my @data; 
push @data, "7 8\t 9"; 
push @data, "4 5\t 6"; 
push @data, "1 2\t 3"; 

my @sorted_data = 
    map { $_->[1] } 
    sort { $a->[0] <=> $b->[0] } 
    map { [ (split $split_regex, $_)[$sort_field], $_ ] } 
    @data; 

print "unsorted\n"; 
print join "\n", @data, "\n"; 
print "sorted by $sort_field, lines split by $split_regex\n"; 
print join "\n", @sorted_data, "\n"; 
2

$解決方案不適合我。 但是,實際上是把自己的製表符的命令所做的: 排序-t「」 -K2

1

我想在Windows的GNU不大不小的解決方案,但上述解決方案均未的工作對我來說在命令行上。

利用勞合社的線索,下面的批處理文件(.bat)爲我工作。

在雙引號內輸入製表符。

C:\>cat foo.bat 

sort -k3 -t" " tabfile.txt 
0

我在使用'general-numeric-sort'時遇到了在bash shell中cygwin排序的問題。如果我指定-t$'\t' -kFg,其中F爲外地號碼,它不工作,但是當我指定了-t$'\t'-kF,Fg(例如-k7,7g第七屆場)它的工作。 -kF,Fg沒有-t$'\t'沒有工作。

3

你需要把實際的製表符後-t \要做到這一點在shell你打CTRL-V,然後製表符。我使用的大多數shell都支持這種模式的文本標籤條目。

但要小心,因爲從另一個地方複製和粘貼通常不會保留製表符。