내 폴더 구조는 다음과 같습니다.
$ 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/......"입니다.
하나의 txt 파일에 Original_folder에 대한 모든 출력 플롯 명령이 있고 다른 모든 폴더에 대한 플롯 명령이 다른 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
설탕의 분자식).