2013-10-09 37 views
0

我有許多帶有製表符分隔的.csv文件,現在我想更改分隔符。 當我使用下面的腳本它不會更改文件。所以請用腳本幫助我。在unix中更改csv文件分隔符

file_mask=$1 
from_delim=$2 
to_delim=$3 
for i in `ls $file_mask*` 
do 
sed -i 's|$from_delim|$to_delim|g' $i 
done 
+0

你得到了什麼錯誤?請注意''from_delim'和'$ to_delim'在'sed'中不會被評估,除非你使用雙引號''' – fedorqui

+0

我用雙引號以及我沒有得到任何錯誤。 – Dileep

回答

2

您需要用雙引號sed的身體使外殼變量可以展開:

sed -i "s|$from_delim|$to_delim|g" $i 

更好的希望既不是$ from_delim也不是$ to_del im包含一個管道。

此外,don't parse ls - 不需要for循環都:

sed -i "s|$from_delim|$to_delim|g" ${file_mask}* 

驗證差異:

file_mask=$1 
from_delim=$2 
to_delim=$3 

sed -i.bak "s|$from_delim|$to_delim|g" $file_mask* 

for f in $file_mask*; do 
    diff -q $f $f.bak >/dev/null 
    if (($? != 1)); then 
     echo "no changes made to $f" 
    fi 
done 
+0

Thanks @glenn jackman。它工作,但我懷疑當我使用這個sed -i的| \ t |^| g'它正在改變這些文件,爲什麼不在循環中? – Dileep

+0

你不需要循環,因爲如果你給多個文件'sed -i'它會依次編輯每一個文件:sed循環遍歷文件本身 –

+0

好的,在更改文件之後,我想要掃描以及文件是否被更改,以便我非常你可以幫助我,我應該如何使用條件 – Dileep

5

您可以使用tr

tr '\t' ',' <inputfile> outfile 

(假設,是新的分隔符)

1

不要使用此sedtr,使用csvtool (可從公共存儲庫獲得)。如果你的字符串中有TAB,上面的簡單工具就會窒息。您將需要使用awk開始計算報價等。這將是一個混亂與這些基本工具。

要用例如TAB替代TAB,分號與csvtool包括所有角落的情況很簡單:

csvtool -t TAB -u ';' cat $ifile -o $ofile

隨着$ifile輸入文件和$ofile輸出文件。