График Gnuplot с использованием данных столбца из нескольких файлов - PullRequest
0 голосов
/ 01 мая 2020

У меня есть два файла "f.txt" и "g.txt". Данные в обоих файлах расположены в два столбца, причем разделитель столбцов представляет собой всего несколько пробелов. Первый столбец обозначает независимую переменную «x», а второй столбец - f (x) (или g (x)). Легко изобразить функцию y = f (x) и y = g (x), но есть ли простой способ построить f (x) против g (x)? Конечно, используя bash, я мог бы создать «промежуточный» файл с первым столбцом g (x) и вторым столбцом f (x), а затем нормально построить этот файл. Есть ли способ сделать это без создания этого файла?

1 Ответ

1 голос
/ 02 мая 2020

Ваш вопрос был частично противоречивым. Похоже, у вас есть два файла с двумя столбцами в каждом, то есть x,f(x) и x,g(x). Я предполагаю, что количество строк и значения х идентичны. И вы «просто» хотите построить f(x) против g(x). Но это не так же, как построение f(g(x)) (как в вашем первоначальном вопросе). В последнем случае вам, вероятно, потребуется интерполяция.

@ Кристоф уже указал на простое решение, объединяющее файлы с помощью awk. Если у вас нет или вы не хотите использовать awk, вот несколько громоздкое решение gnuplot-only .

  1. загрузка файлов 1: 1 в блок данных (см. gnuplot: загрузить файл данных 1: 1 в блок данных , хотя, пока еще не полностью ответил)
  2. удалить символы конца строки. Это зависит от операционной системы. Для Windows я должен поставить \r в качестве символа конца строки (по некоторым причинам не \r\n). В настоящее время я не могу проверить Linux и MacOS.
  3. распечатать / добавить строки в новый блок данных

Данные:

f.txt

A,B
1,3
2,6
3,5

g.txt

A,C
1,8
2,4
3,7

Код:

### merge two files (merging their lines)
# assumption: equal number of lines in each file
reset session

# load files 1:1 to datablocks
FILE1 = 'f.txt'
if (GPVAL_SYSNAME[:7] eq "Windows") { load '< echo   $Data1 ^<^<EOD  & type "'.FILE1.'"' }
else                                { load '< echo "\$Data1  << EOD" &  cat "'.FILE1.'"' } # Linux & MacOS
FILE2 = 'g.txt'
if (GPVAL_SYSNAME[:7] eq "Windows") { load '< echo   $Data2 ^<^<EOD  & type "'.FILE2.'"' }
else                                { load '< echo "\$Data2  << EOD" &  cat "'.FILE2.'"' } # Linux & MacOS

mySeparator = ","
myEOLc = sprintf("\r",0)     # End of Line character Linux: "\n", Windows: "\r\n", Mac: "\r"
# function for removing EOL character(s) from a string
RemoveEOLc(s) = s[strlen(s)-strlen(myEOLc)+1:strlen(s)] eq myEOLc ?  s[1:strlen(s)-strlen(myEOLc)] : s

set print $Data3
    do for [i=1:|$Data1|] {
        print sprintf("%s%s%s", RemoveEOLc($Data1[i]), mySeparator, RemoveEOLc($Data2[i]))
    }
set print

print $Data3
### end of code

Результат:

A,B,A,C
1,3,1,8
2,6,2,4
3,5,3,7

Затем выведите ваши данные так, как вам нравится ...

Дополнение:

Если у ваших файлов есть пробел в качестве разделителя столбцов, вы можете использовать word("string",n) извлечь "столбец" из $Data[i] (см. help word). Затем вам нужно изменить строки:

mySeparator = " "

и

print sprintf("%s%s%s", word(RemoveEOLc($Data1[i]),2), mySeparator, word(RemoveEOLc($Data2[i]),2))

Результат:

B C
3 8
6 4
5 7
...