2017-08-17 175 views
1

我有兩個文件在列中具有相同的字符串,但順序不同。排序命令給出意想不到的輸出

文件測試1:

testbench.clk1 667 
testbench.clk1_temp_net 667 
testbench.clk 2000 

文件測試2:

testbench.clk1 533 
testbench.clk 1611  
testbench.clk1_temp_net 538 

我跑排序在第1列命令的這兩個文件如下所示,給不同的輸出:

sort -t " " -k1 test1 

testbench.clk1 667 
testbench.clk1_temp_net 667 
testbench.clk 2000 

sort -t " " -k1 test2 

testbench.clk1 533 
testbench.clk 1611 
testbench.clk1_temp_net 538 

你能解釋爲什麼我得到這個輸出以及對此有什麼正確的解決方案?

回答

4

info sort

許多選項如何影響「排序」比較線;如果結果是 意外,請嘗試'--debug'選項以查看發生了什麼。

讓我們做到這一點(我de_DE.utf8系統)

sort --debug -k1 file1 
sort: es werden die Sortierregeln für »de_DE.utf8「 verwendet 
sort: führende Leerzeichen sind signifikant in Schlüssel 1: Sie sollten daher wahrscheinlich auch „b「 angeben 

遺憾的是它沒有任何意義英語運行命令顯示會發生什麼。當我運行在命令

sort: sorting rules for »de_DE.utf8「 in use 
sort: preceding whitspace is significant in key 1: You might want to use „b「 

LANG=C sort -k1b file1 

它可以只是

LANG=C sort -b file1 

順序看起來不錯翻譯它。我想這對你來說也是一個本地化問題。


順便說一句,如果你想有一個分層排序字段1,字段2然後用:

LANG=C sort -k1,1b -k2,2n file 

問題被標記但事實證明,在OP使用csh。在這種情況下,你需要通過$LANG這樣的:

env LANG=C sort ... 
+0

哦對不起,我嘗試了所有的選項,像-k1或-k1,1。所以不小心把它放在描述中。已經更新了描述。非常感謝 –

+0

您還在您的一個命令中使用了-n。你確定它現在會給出這個結果嗎? –

+0

@MarekVitek我刪除-n選項(數字排序)後檢查它。它給出了錯誤的輸出 –

0

要正確排序,您需要指定密鑰由您將您的數據由第一在列表中的第二列進行排序,然後。

sort -k1,1 -k2,2 test1 

testbench.clk 2000 
testbench.clk1 667 
testbench.clk1_temp_net 667 

和文件2

sort -k1,1 -k2,2 test2 

testbench.clk 1611 
testbench.clk1 533 
testbench.clk1_temp_net 538 

如果你只使用-K1像你一樣,那麼它會採取第一個關鍵達到行的末尾 - 這是一樣的默認排序。問題在於,顯然將數字之間的空格視爲千位分隔符,就像它在某些語言中一樣。即使沒有使用數字排序,也會將testbench.clk 1611轉換爲testbench.clk1611testbench.clk1 533轉換爲testbench.clk1533

沒有必要弄亂LANG或LC_COLLATE變量。這樣做可能會導致您的某種語言產生錯誤的結果。例如。在捷克語中使用的字符č以及其他許多字符將被錯誤地排序。

+0

爲什麼'-V'(*版本排序*)? – hek2mgl

+0

@ hek2mgl我不太確定。我希望這種行爲沒有任何選擇。我不知道爲什麼它被稱爲版本排序,但無論版本是什麼意思,手冊頁都會說'文本中的自然類型(版本)數字。試試這個'printf'aa bb \ naab b \ na abb \ na cbb「|排序-V'然後嘗試沒有-V並比較結果。 –

+0

正確的方法是使用'-b'--正如我在答案中所示;) – hek2mgl