簡體   English   中英

Linux-數值排序然后覆蓋文件

[英]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似乎有些麻煩,另一種選擇是使用headtail (假設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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM