2013-04-18 20 views
2

我有一個csv文件與一般格式的Linux - 數值排序,然後覆蓋文件

date, 
2013.04.04, 
2013.04.04, 
2012.04.02, 
2013.02.01, 
2013.04.05, 
2013.04.02, 

的腳本我運行將數據添加到該文件,該文件並不一定是按照日期順序。我如何才能將文件放入日期順序(忽略標題)進行排序,並覆蓋原有的文件,而不是寫入標準輸出

我用AWK

awk 'NR == 1; NR > 1 {print $0 | "sort -n"}' file > file_sorted 
mv file_sorted file 

有沒有做到這一點,而無需創建一個更有效的方法一個額外的文件和移動?

回答

3

你可以做到以下幾點:

sort -n -o your_file your_file 

-o定義輸出文件。

輸出

$ cat s 
date, 
2013.04.04, 
2013.04.04, 
2012.04.02, 
2013.02.01, 
2013.04.05, 
2013.04.02, 

$ sort -n -o s s 

$ cat s 
date, 
2012.04.02, 
2013.02.01, 
2013.04.02, 
2013.04.04, 
2013.04.04, 
2013.04.05, 
+1

非常感謝,我不知道我是如何錯過了那一個 – moadeep

2

需要注意的是,如果有腳本和排序是在同一時間運行存在競爭狀態。

如果文件頭數據進行排序之前,您可以使用fedorqui建議的解決方案sort -o file file是安全的(至少是GNU排序,見info sort)。

運行從awksort似乎有點令人費解,另一種選擇是使用headtail(假設的bash shell):

{ head -n1 file; tail -n+2 file | sort -n; } > file_sorted 

現在,有關替換現有文件。據我所知,你有兩個選擇,創建一個新的文件,並替換舊文件與新的一樣,你在你的問題描述,或者你可以使用spongemoreutils這樣的:

{ head -n1 file; tail -n+2 file | sort -n; } | sponge file 

注意sponge還是創建一個臨時文件。

+0

謝謝我從來沒有聽說過現在的海綿 – moadeep

+0

@glennjackman:我在zsh中測試,沒有這些要求。感謝您修復它。 – Thor