我正在尝试编写一个简短的脚本来编辑一些 csv 文件。首先,我需要替换分隔符,然后将编码更改为 UTF-16。我想分两步执行此操作,将结果保存在两个不同的文件夹中,以防出现问题。
第一步(替换分隔符)我已经设法像这样解决并且效果相当好:
mkdir ./01_delimiters
find . -maxdepth 1 -type f -name '*.csv' -exec bash -c 'sed -e "s/|/¦/g" -e "s/╬/|/g" "{}" > ./01_delimiters/"{}"' \;
现在我想从 01_delimiters 文件夹中获取所有文件,更改其编码并将它们保存到文件夹 ./02_encoding 中。我已经尝试了以下几个版本,但它不起作用:
mkdir ./02_encoding
find ./01_delimiters -maxdepth 1 -type f -name '*.csv' -exec bash -c 'iconv -f utf-8 -t utf-16BE "{}" > ./02_encoding/"{}"' \;
它找到的文件没问题,但在输出中抛出“没有这样的文件或目录”错误。有什么想法可以让这项工作发挥作用吗?顺便说一句,我正在使用 Ubuntu。预先非常感谢!
担
答案1
将{}
替换为完整路径。这在第一个命令中有效,因为那里的路径只是./file.csv
.在第二个命令中,名称为./01_delimiters/file.csv
,因此它尝试创建./02_encoding/./01_delimiters/file.csv
.
你可以
mkdir /02_encoding/./01_delimiters
,那么你的输出文件将被放置在该目录中。- 在验证第一个操作正常工作后,将这两个操作合并为一个。即使出了问题,你也没有删除原始文件。
将第二条命令更改为
(cd ./01_delimiters; find . -maxdepth 1 -type f -name '*.csv' -exec bash -c 'iconv -f utf-8 -t utf-16BE "{}" > ../02_encoding/"{}"' \; )
只需使用外壳即可
for file in *.csv; do sed -e "s/|/¦/g" -e "s/╬/|/g" "$file" > "./01_delimiters/$file" iconv -f utf-8 -t utf-16BE "./01_delimiters/$file" > "./02_encoding/$file" done