我有一个通用格式的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
在没有创建其他文件并移动的情况下,是否有更有效的方法来执行此操作?
答案 0 :(得分:8)
您可以执行以下操作:
sort -n -o your_file your_file
-o
定义了输出文件,并且是defined by 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,
答案 1 :(得分:2)
请注意,如果脚本和排序同时运行,则存在竞争条件。
如果文件标题在数据之前排序,则可以使用 fedorqui 建议的解决方案,因为sort -o file file
是安全的(至少使用GNU排序,请参阅info sort
)。
从sort
内运行awk
似乎有点复杂,另一种选择是使用head
和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
仍会创建一个临时文件。