2

I have a number of .csv files with tab delimiter and now I want to change the delimiter. When I use the below script it does not change the file. Please help me with the script.

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

4 回答 4

13

不要使用sedtr为此使用csvtool(可从公共存储库获得)。如果您在字符串中有 TAB,则上述简单工具将会窒息。您将需要使用awk开始计算引号等。这些基本工具会一团糟。

用包含所有极端情况的 csvtool 用分号替换 TAB 很简单:

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

带有$ifile输入文件和$ofile输出文件。

于 2017-01-11T12:34:24.650 回答
8

您可以使用tr

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

(假设这,是新的分隔符)

于 2013-10-09T11:58:27.273 回答
2

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

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

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

另外,不要解析 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
于 2013-10-09T11:58:38.057 回答
2

我推荐使用 csvkit:https ://csvkit.readthedocs.io/en/latest/ 。使用软件包附带的 csv 格式,您可以安全地更改分隔符。

csvformat -D '[your delimiter here]' [file name]
于 2019-11-25T15:22:15.347 回答