将多个目录中的文件从制表符分隔转换为逗号分隔

将多个目录中的文件从制表符分隔转换为逗号分隔

我正在运行 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/*/*

相关内容