2013-04-05 53 views
0

我有兩個我想要比較的文件。一個文件的訂單號按數字順序排列文件的行Linux/Unix

1 somedata otherdata 
2 somedata otherdata 
3 somedata otherdata 
4 somedata otherdata 
5 somedata otherdata 
6 somedata otherdata 
7 somedata otherdata 
8 somedata otherdata 
Y somedata otherdata 
Y somedata otherdata 

其他訂單

1 somedata otherdata 
10 somedata otherdata 
11 somedata otherdata 
12 somedata otherdata 
. 
. 
. 
2 somedata otherdata 
Y somedata otherdata 
Y somedata otherdata 

這將讓我的生活無限更容易,如果我可以排序的第二個文件(因爲第一個文件,我想保持一個頭在我運行它之前,這個頭文件的每一行都以#開始),所以我將蘋果和蘋果進行比較。

我曾嘗試:排序-n -o /home/me/file.txt /home/me/newfile.txt

而這幾乎是我想要的,但它把信件在頂部,而不是底端。像這樣:

Y somedata otherdata 
    Y somedata otherdata 
    1 somedata otherdata 
    2 somedata otherdata 
    3 somedata otherdata 
    4 somedata otherdata 
    5 somedata otherdata 
    6 somedata otherdata 
    7 somedata otherdata 
    8 somedata otherdata 

我該怎麼做數值排序,但最後的字母在底部?或者,如果沒有,那麼是否有辦法排除以特定字符開頭的行?

回答

0

您可以在運行排序之前拉出標題行,然後將它們添加回來。如果你有$n行頭,那麼後下面會管了一切:

head -n $n filewithheader.txt >newfile.txt 
tail -n $((cat filewithheader.txt| wc -l -$n)) | sort -n >>newfile.txt 

現在你可以對文件進行排序都是一樣的。

如果你真的想按字母順序排序,然後數字,那麼我會用grep抓住與文本開頭到一個文件中的行,用grep以數字開頭到第二檔的線,分別對它們進行排序,然後結合。希望有所幫助。

0

爲什麼不在比較前使用相同的算法對它們進行排序?我不確定您是否可以輕鬆地強制sort實用程序來執行您所要求的操作。

+0

第一個文件的頂部有一些元數據,我希望不要混入其中。有沒有辦法排除可能以特定字符開頭的行? – Stephopolis 2013-04-05 19:54:14

+0

'grep -v'通常會這樣做 – 2013-04-05 20:42:38

0

我確定有很多方法可以做到這一點。這是一種方法。用您的輸入文件名代替somedata.txt

要發送到標準輸出:

cat somedata.txt | grep ^[0-9] | sort -n; cat somedata.txt | grep ^[^0-9] | sort 

發送給out.txt

cat somedata.txt | grep ^[0-9] | sort -n > out.txt; cat somedata.txt | grep ^[^0-9] | sort >> out.txt 

以上使用grep分別以數字開頭的行,並且不與開始的行排序數字。然後將其傳送到標準輸出或文件out.txt

1
cat /tmp/file.list | sort -n | grep -v ^[A-Z] > /tmp/file.list.sorted; grep ^[A-Z] /tmp/file.list >> /tmp/file.list.sorted 

這將數值排序位於/tmp/file.list一個文件的內容(不包括以大寫字母開頭的任何字符串)和寫的內容/tmp/file.list.sorted。然後再次解析原始file.list,這次抓取任何以大寫字母開頭的行,然後將結果附加到/tmp/file.list.sorted的底部。