5

我有一个通用格式的 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

有没有更有效的方法可以在不创建额外文件和移动的情况下做到这一点?

4

2 回答 2

11

您可以执行以下操作:

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,
于 2013-04-18T12:17:50.717 回答
2

请注意,如果脚本和排序同时运行,则存在竞争条件。

如果文件头在数据之前排序,您可以使用fedorqui建议的sort -o file file安全解决方案(至少使用 GNU 排序,请参阅参考资料info sort)。

sort从内部运行awk似乎有点复杂,另一种选择是使用headand tail(假设 bash shell):

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

现在,关于替换现有文件。AFAIK,你有两个选择,创建一个新文件并用你在问题中描述的新文件替换旧文件,或者你可以像这样sponge使用moreutils

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

请注意,sponge仍然会创建一个临时文件。

于 2013-04-18T12:20:33.217 回答