내 폴더 구조는 다음과 같습니다.
$ tree
.
├── Original_folder
│ └── cat.txt
├── folderCD
│ └── cat.txt
├── folderGK
│ └── cat.txt
├── folderFE
└── cat.txt
각 cat.txt 파일에는 열 헤더 시작 앞에 5줄이 있습니다. 샘플 cat.txt 파일은 다음과 같습니다.
Version LRv1.10.0
Build date 2017-12-06
MOL-calc
PRESSURE
!
Time[s] InletT[K] InletP[Pa] O2_GasOut C_GasOut
100 0.000885 1000000 0.0007 0.2111
and so on....
열 머리글에 "_GasOut" 키워드가 있는 열뿐만 아니라 첫 번째 열도 플롯하고 싶습니다. (이 키워드가 포함된 헤더 수는 알 수 없습니다. 각 열에 대해 별도의 차트를 갖고 싶습니다.) 또한 Original_folder의 그래픽 결과는 폴더CD, 폴더GK, 폴더FE...등의 모든 플롯에 대해 동일한 차트에 플롯되어야 합니다.
해당 차트는 열 헤더와 동일한 제목으로 해당 폴더에 저장되어야 합니다. 각 그림에는 두 개의 범례가 있어야 합니다. 하나는 "original_folder"이고 다른 하나는 "folderCD/folderGK/..."입니다.
Original_folder에 대한 모든 출력 그리기 명령을 하나의 txt 파일에 넣고 다른 폴더에 대한 모든 그리기 명령을 다른 txt 파일에 넣습니다. 그 이후에는 계속 진행할 방법을 찾을 수 없습니다. 다른 모든 경우에는 어떻게 해야 합니까? 열 머리글을 머리글로 설정하는 방법은 무엇입니까?
최신 업데이트
for dir in folder* ; do
echo "Preparing Post_processing files for ${dir}"
mkdir "$dir"/Post_processing
gawk -F $'\t' '
/_GasOut/{
for(f=1;f<=NF;f++){
hdr=$f
colhdr[f]=hdr
if(index(hdr,"_GasOut"))wanted[f]=1
}
}
ENDFILE{
print "reset\nset terminal pngcairo size 1024,768\nset encoding utf8\nset termoption dash\nset termopt enhanced"
print "set key top right"
print "set xlabel '"'Time[s]'"';"
for(f in wanted){
if(length(cmds)) cmds = cmds ",\n"
hdr = colhdr[f]
gsub(/^[[:space:]]+|[[:space:]]+$/,"",hdr)
printf("set ylabel '"'%s'"';\n",hdr)
printf("set output '"'"$dir/Post_processing"/%s.png'"'\n",hdr)
cmds = cmds "plot ""\"" FILENAME "\" using 1:" f " with lines" ","
#print "plot " FILENAME using 1:" f " with lines" ",""
cmds=cmds"'"'Original_folder/cat.txt'"' using 1:" f " with lines"
}
delete wanted
}
END{
print cmds
}
' "$dir"/cat.txt>"$dir"/plot.gpl
gnuplot "$dir"/plot.gpl
done
현재 출력은 다음과 같습니다
reset
set terminal pngcairo size 1024,768
set encoding utf8
set termoption dash
set termopt enhanced
set xlabel 'Time[s]';
set ylabel 'H2_GasOut';
set output 'folderCD/Post_processing/H2_GasOut.png'
set ylabel 'O2_GasOut';
set output 'folderGK/Post_processing/O2_GasOut.png'
set ylabel 'H2O_GasOut';
set output 'folderFE/Post_processing/H2O_GasOut.png'
plot "folderCD/cat.txt" using 1:28 with lines,'Original_folder/cat.txt' using 1:28 with lines,
plot "folderGK/cat.txt" using 1:29 with lines,'Original_folder/cat.txt' using 1:29 with lines,
plot "folderGK/cat.txt" using 1:30 with lines,'Original_folder/cat.txt' using 1:30 with lines
원하는 출력
reset
set terminal pngcairo size 1024,768
set encoding utf8
set termoption dash
set termopt enhanced
set xlabel 'Time[s]';
set ylabel 'H2_GasOut';
set output 'folderCD/Post_processing/H2_GasOut.png'
plot "folderCD/cat.txt" using 1:28 with lines,'Original_RedKinMec/cat.txt' using 1:28 with lines,
set ylabel 'O2_GasOut';
set output 'folderGK/Post_processing/O2_GasOut.png'
plot "folderGK/cat.txt" using 1:29 with lines,'Original_folder/cat.txt' using 1:29 with lines,
set ylabel 'H2O_GasOut';
set output 'folderFE/Post_processing/H2O_GasOut.png'
plot "folderGK/cat.txt" using 1:30 with lines,'Original_folder/cat.txt' using 1:30 with lines
이렇게 출력해도 좋을 것 같아요
set terminal pngcairo size 1024,768
set encoding utf8
set termopt dash
set termopt enhanced
set key top right
set xlabel "Time[s]"
set ylabel "O2_GasOut"
set output "Post_processing/O2_GasOut.png"
plot "folder1/cat.txt" using 1:22 with lines,\
plot "folder2/cat.txt" using 1:22 with lines,\
plot "folder3/cat.txt" using 1:22 with lines,\
plot "folder4/cat.txt" using 1:22 with lines
set ylabel "H2O_GasOut"
set output "Post_processing/H2O_GasOut.png"
plot "folder1/cat.txt" using 1:23 with lines,\
plot "folder2/cat.txt" using 1:23 with lines,\
plot "folder3/cat.txt" using 1:23 with lines,
plot "folder4/cat.txt" using 1:23 with lines
set ylabel "H2_GasOut"
set output "Post_processing/H2_GasOut.png"
plot "folder1/cat.txt" using 1:24 with lines,\
plot "folder2/cat.txt" using 1:24 with lines,\
plot "folder3/cat.txt" using 1:24 with lines,\
plot "folder4/cat.txt" using 1:24 with lines
N.B: folder numbers are not fixed.
I added one of the cat.txt file for reference. https://1drv.ms/t/s!Aoomvi55MLAQh1wMmpnPGnliFmgg
답변1
bash
먼저 스크립트를 분할하여 스크립트와 스크립트 파일을 갖도록 하겠습니다 awk
. 이렇게 하면 스크립트에서 이스케이프가 덜 필요하며 - 옵션을 사용 bash
하여 변수를 전달할 수 있습니다.awk
-v
for dir in folder* ; do
echo "Preparing Post_processing files for ${dir}"
mkdir "${dir}"/Post_processing
gawk -f make_gpl.awk -v dirname="${dir}" "${dir}"/cat.txt > "${dir}"/plot.gpl
gnuplot "${dir}"/plot.gpl
done
이제 스크립트는 bash
매우 간단해졌습니다.
스크립트의 일부 수정 및 단순화 awk
- 주석이 충분히 설명되기를 바랍니다.
#inserted field separator definition into script
BEGIN { FS="\t" }
/_GasOut/{
for(f=1;f<=NF;f++){
# $a ~ "B" matches if string B is part of field $a
# only these elements are taken to array colhdr
if ($f ~ "_GasOut") colhdr[f]=$f
}
}
ENDFILE{
#split prints with newlines into separate splits for readability
print "set terminal pngcairo size 1024,768
print "set encoding utf8"
print "set termopt dash"
print "set termopt enhanced"
print "set key top right"
print "set xlabel \"Time[s]\""
#for loop only matches if element of array colhdr is set
for(f in colhdr){
#it looks like there are only preceding spaces
gsub(/^ +/,"",colhdr[f])
#printing strings only - no printf needed
#escaping quotes if they need to be printed
#removed semicolons and commas at end of plot command - newline will do
print("set ylabel \""colhdr[f]"\"")
print("set output \""dirname"/Post_processing/"colhdr[f]".png\"")
print("plot \""FILENAME"\" using 1:"f" with lines")
}
}
생성한 스크립트 및 샘플 플롯 파일 사용 cat.txt
:
set terminal pngcairo size 1024,768
set encoding utf8
set termopt dash
set termopt enhanced
set key top right
set xlabel "Time[s]"
set ylabel "O2_GasOut"
set output "folder1/Post_processing/O2_GasOut.png"
plot "folder1/cat.txt" using 1:22 with lines
set ylabel "H2O_GasOut"
set output "folder1/Post_processing/H2O_GasOut.png"
plot "folder1/cat.txt" using 1:23 with lines
set ylabel "H2_GasOut"
set output "folder1/Post_processing/H2_GasOut.png"
plot "folder1/cat.txt" using 1:24 with lines
set ylabel "N2_GasOut"
set output "folder1/Post_processing/N2_GasOut.png"
plot "folder1/cat.txt" using 1:25 with lines
set ylabel "NO_GasOut"
set output "folder1/Post_processing/NO_GasOut.png"
plot "folder1/cat.txt" using 1:26 with lines
set ylabel "NO2_GasOut"
set output "folder1/Post_processing/NO2_GasOut.png"
plot "folder1/cat.txt" using 1:27 with lines
set ylabel "N2O_GasOut"
set output "folder1/Post_processing/N2O_GasOut.png"
plot "folder1/cat.txt" using 1:28 with lines
플롯의 y 레이블 형식이 잘못되었을 수 있지만 필요한 형식이 무엇인지 잘 모르겠습니다. _
다음 문자를 첨자로 만듭니다 termopt enhanced
. 더 많은 문자를 아래 첨자로 만들려면 C_6H_{12}O_6
설탕의 분자식 과 같이 괄호를 사용하세요 .