[英]Linux - numerical sort then overwrite file
我有一個具有常規格式的csv文件
date,
2013.04.04,
2013.04.04,
2012.04.02,
2013.02.01,
2013.04.05,
2013.04.02,
我運行的腳本會將數據添加到此文件中,但不一定按日期順序。 如何將文件按日期順序排序(忽略標題)並覆蓋現有文件,而不是寫入STDOUT
我用過awk
awk 'NR == 1; NR > 1 {print $0 | "sort -n"}' file > file_sorted
mv file_sorted file
有沒有更有效的方法來執行此操作而無需創建其他文件並移動?
您可以執行以下操作:
sort -n -o your_file your_file
-o
定義輸出文件, 並由POSIX定義 ,因此可以安全使用(不破壞原始文件)。
輸出量
$ 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,
請注意,如果腳本和排序同時運行,則存在競爭條件。
如果文件頭在數據之前排序,則可以使用fedorqui建議的解決方案,因為sort -o file file
是安全的(至少使用GNU sort,請參閱info sort
)。
從awk
內運行sort
似乎有些麻煩,另一種選擇是使用head
和tail
(假設bash shell):
{ head -n1 file; tail -n+2 file | sort -n; } > file_sorted
現在,關於替換現有文件。 AFAIK,您有兩個選擇,創建一個新文件,然后按照問題中的描述用新文件替換舊文件,或者可以使用moreutils
sponge
,如下所示:
{ head -n1 file; tail -n+2 file | sort -n; } | sponge file
請注意, sponge
仍然會創建一個臨時文件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.