我有许多带制表符分隔的.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 :(得分: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)
请勿使用sed
或tr
,请使用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]