Bash 스크립트: 파일 이름을 헤더로 CSV로 내보내는 방법

Bash 스크립트: 파일 이름을 헤더로 CSV로 내보내는 방법

내 폴더 "Subj1"에 다음 형식으로 정렬된 여러 개의 .txt 파일이 있습니다.

  regional_vol_GM_atlas1.txt
  regional_vol_GM_atlas1_prop.txt
  ....
  regional_vol_GM_atlas152.txt

각 파일은 다음 형식의 데이터로 구성됩니다.

667869 667869
580083 580083
316133 316133
11398.1 11398.1

관련 파일 이름과 함께 텍스트 파일의 데이터를 csv 파일로 내보내고 싶습니다.

나는 이것에 대한 코드를 작성했습니다

#!/bin/bash

for x in regional_vol*.txt; do

   /bin/echo -n -e "$x\t"

done

paste regional_vol*.txt >> final_table.csv

각 파일의 데이터를 csv 파일에 붙여넣습니다. 샘플 출력 이미지는 아래와 같습니다.

출력 이미지

하지만 출력에서 ​​관련 파일 이름을 데이터 헤더로 가져오고 싶습니다. 이러한 출력을 얻으려면 어떻게 코드를 변경해야 합니까?

다음은 내가 기대하는 출력의 예입니다.

샘플 출력

답변1

내 생각에 당신이 원하는 것은 간단한 명령 리디렉션이고 개행 문자를 인쇄하는 echo또 다른 리디렉션일 가능성이 높습니다 . echo이 같은:

files="regional_vol*.txt"
dst=final_table.csv
# remove the hash sign here to truncate the destination before writing
# > $dst    
for x in $files; do
   /bin/echo -n -e "$x\t" >> $dst
done
echo >> $dst
paste $files >> $dst

또는 printf루프를 다음으로 바꾸십시오.

printf "%s\t" $files >> $dst
echo >> $dst
paste $files >> $dst

두 가지 모두 헤더 줄 끝에 추가 탭을 인쇄하지만 이는 중요하지 않습니다.

답변2

간단하지만 우아하지 않은 해결책은 각 파일의 첫 번째 줄에 파일 이름을 추가하는 것입니다.

for x in $(ls regional_vol*.txt | sort -n); do
   echo ${x} > tmp-${x}
   cat ${x} >> tmp-${x}
done

paste tmp-regional_vol*.txt > final_table.csv
rm tmp-regional_vol*.txt

답변3

(각 파일이 그림의 열이므로 파일을 회전했다고 가정합니다.)

스크립트에서 각 파일은 CSV에 행으로 추가됩니다. CSV의 각 행은 스프레드시트의 행이어야 합니다.

SED 및 AWK를 사용하여 파일 내용을 조작하고 "filename,field1,field2,field3,..." 문자열을 빌드합니다. CSV에 추가하려면 이 문자열을 에코하세요.

그런 다음 이미지에서 스프레드시트를 열 때 스프레드시트에서 수행한 것과 동일한 회전 작업을 수행합니다. 또는 일반적인 "각 줄은 항목입니다" 형식을 유지하세요. 파일 이름은 제목이 아닌 필드여야 하므로 실제로 권장됩니다. 즉, 헤더 이름이 filename인 필드에는 CSV에 있는 각 항목의 파일 이름이 포함되어야 합니다.

관련 정보