2016-05-31 63 views
0

我想对排序的数据进行排序并更新现有文件。排序文件

country.csv文件内容

India,Australia 

,我现在用的就是

tr , '\n' < country.csv | sort -n | paste -sd, - > country.csv 

但该命令,当我检查,country.csv是空的。

+0

... btw,'sort -n'?您的示例数据没有任何数字内容。 –

回答

1

这是预期:管道安装发生之前管线内部的计划已经执行(主要是 - 这是不同步的,所以在有些情况下的execve呼吁管道的早期部分仍然可以发生,而后面部分的重定向不完整),因此您的>country.csv在读取文件之前擦除文件内容。

写入不同的输出文件并重命名。

即:

#!/bin/bash 
#  ^^^^- to let us use the below safety feature: 
set -o pipefail # bashism: fail the whole pipeline if any component fails 

tempfile=$(mktemp country.csv.XXXXXX) 
if tr , '\n' <country.csv | sort -n | paste -sd, - >"$tempfile"; then 
    mv "$tempfile" country.csv 
else 
    rm -f "$tempfile" 
fi 

采用mktemp确保这多个实例可以在同一时间运行,而且每次都会有自己的临时文件 - 因此,他们不会伤害,他人的工作 - 同时也表达了对一些安全漏洞(如符号链接攻击)的抵制。

它确实增加了一个警告,因为mktemp设置了限制性文件权限 - 如果您打算输出文件是组或世界可访问的,则可能需要自行更新这些文件。