Моя структура папок выглядит примерно так
$ 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 должны быть построены на том же графике для всех графиков из folderCD, folderGK, folderFE...... и так далее.
Соответствующий график должен быть сохранен в соответствующих папках с таким же названием, как заголовок столбца. В каждом графике должно быть две легенды: одна "original_folder", а другая "folderCD/folderGK/......"
Я получил все команды вывода plot для Original_folder в одном txt-файле и команды plot для всех остальных папок в другом 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
для молекулярной формулы сахара.