내 폴더 "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에 있는 각 항목의 파일 이름이 포함되어야 합니다.