我正在运行 Mac 操作系统。
/Users/sethparker/Documents
我有一个包含几个子目录/Users/sethparker/Documents/dir1
, /Users/sethparker/Documents/dir2
,的目录/Users/sethparker/Documents/dir3
。每个子目录都充满了名称相同、制表符分隔的文件file1.txt
, file2.txt
, file3.txt
.
我希望所有子目录中的所有文件都转换为逗号分隔,尽管扩展名本身并不重要。我当前的方法是在每个子目录中运行一个简短的脚本。
cat tsv_to_csv.sh
for ifile in {1..3};
do
sed -i "" 's/\t/,/g' file${ifile}*
done
是否有一种有效的方法可以将这种类型的处理同时应用于所有子目录中的所有文件?
答案1
处理边缘情况(例如出现在带引号的字段中的制表符,或出现在引号中的逗号)未引用的字段),建议对 CSV 数据使用 CSV 解析器。
使用csvkit
(以及sponge
来自moreutils
包装)
for file in glob_pattern; do
csvformat --tabs --out-delimiter , "$file" | sponge "$file"
done
演示:
$ cat input.tsv
first "second third" fourth
she said Hello, world!
第一行有一个带引号的选项卡
$ csvformat --tabs --out-delimiter , input.tsv
first,second third,fourth
she,said,"Hello, world!"
答案2
如果你可以安全地运行这个全部子目录和全部这些子目录中的文件,您所需要的是:
sed -i "" 's/\t/,/g' /Users/sethparker/Documents/*/*