카탈로그 txt 파일을 적절한 열 이름을 가진 유용한 병합 csv 파일로 변환

카탈로그 txt 파일을 적절한 열 이름을 가진 유용한 병합 csv 파일로 변환

터미널 명령줄에서 다음을 수행하려고 합니다.

디렉터리의 각 하위 폴더에 있는 텍스트 파일(allMovement_Regressors.txt, 12열, 548줄)을 동일한 하위 폴더에 저장된 csv 파일로 변환합니다. 이 코드를 시도했지만 각 데이터세트가 함께 쌓인 파일만 제공되었습니다.

cat */*/*/*/allMovement_Regressors.txt | tr -s '[:blank:]' ',' > ofile.csv

디렉토리 구조:

/Volumes/My\ Book\ Studio/Directory/1/Results/allMovement_Regressors.txt
/Volumes/My\ Book\ Studio/Directory/2/Results/allMovement_Regressors.txt
/Volumes/My\ Book\ Studio/Directory/3/Results/allMovement_Regressors.txt

각 하위 폴더의 모든 csv 파일을 하나의 csv 파일로 연결합니다. 델타 데이터는 이전 데이터 세트의 오른쪽에 연결되며, 열은 다음과 같이 하위 폴더 이름과 변수 순서에 따라 명명됩니다.

1_1 1_2 1_3 1_4 1_5 1_6 1_7 1_8 1_9 1_10 1_11 1_12 2_1 2_2 2_3 2_4 2_5 2_6 2_7 2_8 2_9 2_10 2_11 2_12 3_1 3_2 3_3 3_4 3_5 3_6 3_7 3_8 3_9 3_10 3_11 3_12 

매우 감사합니다.

답변1

별도의 csv 파일을 생성하려면:

$ find /Volumes/My\ Book\ Studio/ -type f -name 'allMovement_Regressors.txt' \
-exec bash -c 'tr -s "[:blank:]" "," < "$1" > "${1%.txt}.csv"' tocsv {} \;

"tocsv"는 exec의 bash 스크립트 이름으로 프로세스 목록에 나타납니다.

"allMovement_Regressors.txt"가 포함된 디렉터리 수를 알고 있는 경우 다음과 같이 헤더 줄을 작성할 수 있습니다(X를 올바른 번호로 교체).

printf '%s,' {1..X}_{1..12} | sed 's/,$/\n/' > ofile.csv

그리고 그것들을 하나로 합치십시오:

$ find /Volumes/My\ Book\ Studio/ -type f -name 'allMovement_Regressors.csv' -print0 \
| sort -z \
| xargs -0 paste \
| tr '\t' ',' >> ofile.csv

파일은 paste함께 결합되기 전에 숫자별로 정렬됩니다. -print0파일 이름에 공백이 있기 때문에 여기서는 이것을 사용하고 있습니다 . pasteCSV에서 원하지 않는 탭으로 구분된 열을 사용하므로 이 열도 교체해야 합니다.

고쳐 쓰다

@bu5hman이 제목을 만드는 방법에 대해 답변해 주셨습니다. 나 이거 완전 훔쳐가고 있어! 내 답변이 마음에 들면 @bu5hman의 답변을 꼭 찬성해주세요 :-)

답변을 통합하여 thingy.sh다음에 제공할 수 있는 스크립트를 작성하세요 -exec.

#!/bin/bash
t=$(echo "$1" | grep -Po "(?<=/)[0-9]+(?=/)")
u=$(echo 1_$(seq -s " ${t}_" $(cat "$1" | awk "{print NF}")))

sed "i \\$u" "$1" \
| tr -s "[:blank:]" "," > "${1%.txt}.csv"

그런 다음 입력하십시오 -exec.

find Volumes/My\ Book\ Studio/ -type f -name 'allMovement_Regressors.txt' \
-exec /path/to/thingy.sh {} \;

그런 다음 두 번째 find명령을 사용하여 모든 것을 하나로 합칩니다.

답변2

위에서 파일의 aggregation에 대한 답변이 잘 되었으므로, aggregation 전에 각 파일에 헤더를 삽입하는 방법은 다음과 같습니다. 라벨에는 숫자로만 구성된 디렉토리를 사용하고 필드 수에는 제한이 없습니다.

테스트를 위해 sed에서 제거되었습니다 -i...

find ./tmp -type f -name "qwerty" -exec sh -c 't=$(echo "$1" | grep -Po "(?<=/)[0-9]+(?=/)"); u=$(echo ${t}_$(seq -s " ${t}_" $(cat "$1" | awk "{print NF}"))); sed -i "i \\$u" "$1"' sh {} \;

파일은 다음 위치에 있습니다./home/bu5hman/tmp/1/end/qwerty

콘텐츠

q w e r t y u i o p

산출

1_1 1_2 1_3 1_4 1_5 1_6 1_7 1_8 1_9 1_10
q w e r t y u i o p

물론 원본 파일을 보존하기 위해 출력을 임시 파일 세트로 리디렉션할 수도 있습니다.

답변3

paste대신 당신이 원하는 cat:

paste -d' ' */*/*/*/allMovement_Regressors.txt | tr -s '[:blank:]' ',' > ofile.csv

관련 정보