같은 이름의 텍스트 파일이 많이 있습니다. 각 파일은 서로 다른 폴더에 저장되며 각 파일에는 다음과 같은 숫자 열이 포함됩니다.
FILE.TXT FILE.TXT FILE.TXT FILE.TXT ....
5 4 5 7
8 2 1 5
6 1 1 1
1 3 5 9
3 1 8 9
. . . .
. . . .
. . . .
파일을 스프레드시트(CSV 형식)로 병합하고 열의 이름을 파일이 포함된 폴더와 동일하게 만들고 싶습니다. 나는 다음과 같이 for 루프를 시도했습니다.
#!/bin/bash
in=a/b/c
for i in $(cat $in/folders_names.txt); do # i is the folder name that contain the file.txt
paste ${in}/${i}/file.txt
done > all_files.txt
sed 's/ */,/g' all_files.txt >all_files.csv &
이 코드는 모든 파일의 모든 열을 하나의 열(all_files.txt 파일)에 붙여넣습니다. 내가 뭘 잘못했는지 모르겠습니다. 어떤 제안이 있으십니까?
답변1
{ paste -d, /dev/null "${in}"/folders_names.txt | tr -d \\n | cut -c2-; \
sed 's|.*|'"${in}"'/&/file.txt|' "${in}"/folders_names.txt \
| tr \\n \\0 | xargs -0 paste -d,; } > all_files.csv
첫 번째 명령
paste -d, /dev/null "${in}"/folders_names.txt | tr -d \\n | cut -c2-
예를 들어 다음과 같은 경우 제목을 인쇄하세요 "${in}"/folders_names.txt
.
w
x
y
z
그것은 인쇄한다w,x,y,z
이 sed
명령은 각 줄이 경로가 되도록 동일한 파일을 처리합니다. 예를 들어 다음과 같습니다 in=a/b/c
.
a/b/c/w/file.txt
a/b/c/x/file.txt
a/b/c/y/file.txt
a/b/c/z/file.txt
결과는 via tr
에 대한 null로 구분된 입력으로 변환 되므로 최종 출력은 다음과 같습니다.paste
xargs -0
w,x,y,z
5,4,5,7
8,2,1,5
6,1,1,1
1,3,5,9
3,1,8,9
포함된 공백(예: 일반 파일 이름)에 줄이 없으면 folders_names.txt
다음을 실행할 수 있습니다.
{ paste -d, /dev/null "${in}"/folders_names.txt | tr -d \\n | cut -c2-; \
paste -d, $(sed 's|.*|'"${in}"'/&/file.txt|' "${in}"/folders_names.txt); } > all_files.csv
두 번째 명령은 다음으로 확장되기 때문에
paste -d, a/b/c/w/file.txt a/b/c/x/file.txt a/b/c/y/file.txt a/b/c/z/file.txt