在unix中更改csv文件分隔符

时间:2013-10-09 11:54:49

标签: linux shell unix sed

我有许多带制表符分隔的.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

4 个答案:

答案 0 :(得分:6)

您可以使用tr

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

(假设,是新的分隔符)

答案 1 :(得分:2)

您需要为sed主体使用双引号,以便可以扩展shell变量:

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

更好的希望$ from_delim和$ to_delim都不包含管道。

此外,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

答案 2 :(得分:2)

请勿使用sedtr,请使用csvtool(可从公共存储库获取)。如果您在字符串中有TAB,则上述简单工具会窒息。您将需要使用awk来开始计算报价等。这些基本工具会变得混乱。

用例如TAB替换TAB带有csvtool的分号包括所有角落案例很简单:

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

输入文件为$ifile,输出文件为$ofile

答案 3 :(得分:1)

我建议使用csvkit:https://csvkit.readthedocs.io/en/latest/。使用该软件包随附的csvformat,可以安全地更改定界符。

csvformat -D '[your delimiter here]' [file name]