2016-05-31 57 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設置了限制性文件權限 - 如果您打算輸出文件是組或世界可訪問的,則可能需要自行更新這些文件。