Mi estructura de carpetas se parece a esto
$ tree
.
├── Original_folder
│ └── cat.txt
├── folderCD
│ └── cat.txt
├── folderGK
│ └── cat.txt
├── folderFE
└── cat.txt
Cada archivo cat.txt tiene 5 líneas antes de comenzar el encabezado de la columna. El archivo cat.txt de muestra es así
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....
Quiero trazar la primera columna junto con la columna que tiene un encabezado de columna con la palabra clave "_GasOut". (Hay un número desconocido de encabezados con estas palabras clave. Para cada columna me gustaría tener un gráfico separado). Además, los resultados gráficos de Carpeta_original deben trazarse en el mismo gráfico para todos los trazados de carpetaCD, carpetaGK, carpetaFE... y así sucesivamente.
El gráfico correspondiente debe guardarse en las carpetas correspondientes con el mismo título que el encabezado de la columna. En cada gráfico debe haber dos leyendas, una es "carpeta_original" y otra es "carpetaCD/carpetaGK/......"
Obtuve todos los comandos de trazado de salida para Original_folder en un archivo de texto y los comandos de trazado para todas las demás carpetas en otro archivo de texto. Después de eso, no encuentro la manera de seguir adelante. ¿Cómo puedo hacer esto en todos los demás casos? ¿Y cómo hacer que el encabezado de la columna sea título?
ÚLTIMA ACTUALIZACIÓN
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
La salida actual es así.
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
Salida deseada
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
También es bueno tener una salida como esta.
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
Respuesta1
Primero, dividamos el script para que tengamos un bash
script y un awk
archivo de script. De esa manera necesitarás menos escapes en el bash
script y podrás reenviar variables awk
con la -v
opción -.
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
El bash
guión ahora es bastante simple.
Algunas correcciones y simplificaciones en el awk
guión. Espero que los comentarios expliquen lo suficientemente bien:
#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")
}
}
Ejemplo de archivo de trazado creado con el script y su 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
Tenga en cuenta que el formato de las etiquetas y en sus gráficos puede ser incorrecto, pero no estoy seguro del formato deseado. _
creará el siguiente subíndice de caracteres con termopt enhanced
. Para hacer que más caracteres vayan en subíndice, utilice paréntesis, por ejemplo, C_6H_{12}O_6
para la fórmula molecular del azúcar.