디렉터리 이름을 열 이름으로 사용하여 동일한 이름의 단일 열 파일을 붙여넣습니다.

디렉터리 이름을 열 이름으로 사용하여 동일한 이름의 단일 열 파일을 붙여넣습니다.

같은 이름의 텍스트 파일이 많이 있습니다. 각 파일은 서로 다른 폴더에 저장되며 각 파일에는 다음과 같은 숫자 열이 포함됩니다.

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로 구분된 입력으로 변환 되므로 최종 출력은 다음과 같습니다.pastexargs -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

관련 정보