Gnuplot: вывод из * txt файлов из разных каталогов путем чтения заголовка столбца - PullRequest
1 голос
/ 28 мая 2019

Моя структура папок выглядит примерно так

$ tree
.
├── Original_folder
│   └── cat.txt
├── folder1
│   └── cat.txt
├── folder2
│   └── cat.txt
├── folder3
│   
└── 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 должны быть нанесены на один график для всех графиков из folder1, folder2, folder3 ...... и т. Д.

Соответствующий график должен быть сохранен в соответствующих папках.

N.B: номера папок не фиксированы. Я добавил один из файлов cat.txt для справки. https://1drv.ms/t/s!Aoomvi55MLAQh1wMmpnPGnliFmgg

Ответы [ 3 ]

0 голосов
/ 28 мая 2019

Это можно сделать целиком в gnuplot.

Я не совсем понимаю, где скрипт должен найти имена для сопоставления с желаемыми заголовками столбцов, но вот простой скрипт gnuplot, который работает для одногоизвестный заголовок столбца, за которым следует немного более сложный сценарий, предполагающий, что вы собрали нужные имена в массив строк.

set term pdf
set key autotitle columnheader   # not strictly necessary but ensures the program
                                 # interprets the first line of data as headers
HEADER = "_GasOut"
orig = "original_folder/cat.txt"
do for [f=1:10] {                # 10 folders 
  in = sprintf("folder%d/cat.txt", f)
  out = sprintf("folder%d/plot.pdf")
  plot orig skip 5 using 1:(column(HEADER)), \
       in skip 5 using 1:(column(HEADER))
}

Теперь давайте сделаем то же самое, за исключением того, что мы добавим цикл над несколькими заголовками столбцов.

set term pdf
set key autotitle columnheader

array HEADS = [ "C_GasOut", "SurfaceT_cell7[K]", "O2_intMassFlowOut[kg]", \
                  "H2O_Conv", "InletT[K]" ]
orig = "original_folder/cat.txt"

do for [h = 1 : |HEADS|] {
  HEADER = HEADS[h]
  do for [f=1:10] { 
    in = sprintf("folder%d/cat.txt", f)
    out = sprintf("folder%d/plot.pdf")
    plot orig skip 5 using 1:(column(HEADER)), \
         in skip 5 using 1:(column(HEADER))
  }
}

Если имена или количество подпапок заранее неизвестны, вы можете заменить цикл [f = 1: 10] на цикл, повторяющийся в списке имен папок.Например:

folders = system("ls -1 fold*")
nfolders = words(folders)
do for [f = 1 : nfolders] {
    in = sprintf("%s/cat.txt", folders(word(folders,f)))
    ... etc
0 голосов
/ 31 мая 2019

В этом примере показано, как построить все столбцы, заголовок которых содержит подстроку "_GasOut". Стратегия состоит в том, чтобы проверить каждый заголовок столбца для подстроки; если он совпадает, то значения столбца выводятся на график, если совпадения нет, все значения рассматриваются как NaN. set datafile missing NaN затем вызывает пропуск всего графика.

Я не повторяю здесь итерацию по подкаталогам, как показано в предыдущих примерах.

set rmargin at screen 0.85
set key reverse Left top left at screen 0.85, 0.9
set log y

data = 'cat.txt'
set datafile missing NaN

plot for [i=1:99] data skip 5 using 1:(strstrt(columnhead(i),"_GasOut") ? column(i) : NaN) title columnhead(i) noenhanced lw 2

resulting plot

0 голосов
/ 28 мая 2019

Обновленный ответ

Я не знаю достаточно о gnuplot, чтобы понять синтаксис того, что вы хотите сделать, как описано в вашем комментарии. Я добавил код, который сохраняет заголовки столбцов и обрезает все пробелы, а также код, который выводит имя папки из имени файла - но я понятия не имею, как вы будете их использовать, поэтому я просто распечатаю их. Смотрите строку, помеченную "FIXME" в коде!

#!/bin/bash

gawk -F $'\t' '                                     # Using TABs as field separators
   /_GasOut/{                                       # On lines containing "_GasOut"
      for(f=1;f<=NF;f++){                           # ... iterate over all fields on line
         hdr=$f                                     # ... picking them up
         colhdr[f]=hdr                              # ... saving the column headers
         if(index(hdr,"_GasOut"))wanted[f]=1        # ... and noting which ones we want to print
      }
   }
   ENDFILE{                                         # As we reaach end of each file
      for(f in wanted){                             # ... iterate over wanted fields
         if(length(cmds)) cmds = cmds ",\n"         # ... adding commas and newlines if needed
         hdr = colhdr[f]                            # ... grabbing column header
         gsub(/^[[:space:]]+|[[:space:]]+$/,"",hdr) # ... trim leading or trailing spaces
         folder = FILENAME
         gsub(/\/cat.txt/,"",folder)                # ... deriving foldername
         print "hdr=", hdr, ", folder=", folder     # FIXME
         cmds = cmds "\"" FILENAME "\" using 1:" f  # ... and adding the "using" statement
      }
      delete wanted                                 # Forget list of wanted fields for next file
   }
   END{                                             # At very end of last file
      print cmds                                    # ... print accumulated gnuplot cmds
   }

   ' folder*/cat.txt

Пример вывода

hdr= O2_GasOut , folder= folder1
hdr= H2O_GasOut , folder= folder1
hdr= H2_GasOut , folder= folder1
hdr= N2_GasOut , folder= folder1
hdr= NO_GasOut , folder= folder1
hdr= NO2_GasOut , folder= folder1
hdr= N2O_GasOut , folder= folder1
hdr= O2_GasOut , folder= folder2
hdr= H2O_GasOut , folder= folder2
hdr= H2_GasOut , folder= folder2
hdr= N2_GasOut , folder= folder2
hdr= NO_GasOut , folder= folder2
hdr= NO2_GasOut , folder= folder2
hdr= N2O_GasOut , folder= folder2
"folder1/cat.txt" using 1:22,
"folder1/cat.txt" using 1:23,
"folder1/cat.txt" using 1:24,
"folder1/cat.txt" using 1:25,
"folder1/cat.txt" using 1:26,
"folder1/cat.txt" using 1:27,
"folder1/cat.txt" using 1:28,
"folder2/cat.txt" using 1:22,
"folder2/cat.txt" using 1:23,
"folder2/cat.txt" using 1:24,
"folder2/cat.txt" using 1:25,
"folder2/cat.txt" using 1:26,
"folder2/cat.txt" using 1:27,
"folder2/cat.txt" using 1:28

Оригинальный ответ

Я не могу считать поля так же, как вы, но вот что у меня есть:

#!/bin/bash

gawk -F $'\t' '                                     # Using TABs as field separators
   /_GasOut/{                                       # On lines containing "_GasOut"
      for(f=1;f<=NF;f++){                           # ... iterate over all fields on line
         this=$f                                    # ... picking them up
         if(index(this,"_GasOut"))wanted[f]=1       # ... and noting which ones we want to print
      }
   }
   ENDFILE{                                         # As we reaach end of each file
      for(f in wanted){                             # ... iterate over wanted fields
         if(length(cmds)) cmds = cmds ",\n"         # ... adding commas and newlines if needed
         cmds = cmds "\"" FILENAME "\" using 1:" f  # ... and adding the "using" statement
      }
      delete wanted                                 # Forget list of wanted fields for next file
   }
   END{                                             # At very end of last file
      print cmds                                    # ... print accumulated gnuplot cmds
   }

   ' folder*/cat.txt

А вот пример вывода:

"folder1/cat.txt" using 1:22,
"folder1/cat.txt" using 1:23,
"folder1/cat.txt" using 1:24,
"folder1/cat.txt" using 1:25,
"folder1/cat.txt" using 1:26,
"folder1/cat.txt" using 1:27,
"folder1/cat.txt" using 1:28,
"folder2/cat.txt" using 1:22,
"folder2/cat.txt" using 1:23,
"folder2/cat.txt" using 1:24,
"folder2/cat.txt" using 1:25,
"folder2/cat.txt" using 1:26,
"folder2/cat.txt" using 1:27,
"folder2/cat.txt" using 1:28
...