여러 디렉터리의 파일을 탭으로 구분된 파일에서 쉼표로 구분된 파일로 변환

여러 디렉터리의 파일을 탭으로 구분된 파일에서 쉼표로 구분된 파일로 변환

저는 Mac OS를 사용하고 있습니다.

/Users/sethparker/Documents여러 하위 디렉터리가 있는 디렉터리 가 있습니다 /Users/sethparker/Documents/dir1. 각 하위 디렉터리는 탭으로 구분된 동일한 이름의 파일 , , 로 채워집니다 ./Users/sethparker/Documents/dir2/Users/sethparker/Documents/dir3file1.txtfile2.txtfile3.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/*/*

관련 정보