2015-10-18 1 views
-1

Я имею дело с несколькими файлами, и я хочу построить карту тепла every ::121::600 using 3:25:43 из этих файлов. Есть ли способ, чтобы объединить все файлы на лету, чтобы получить тепловую карту с командами, как:Карта тепла из нескольких файлов с cat, awk или sed (bash)

set dgrid3d 
splot '< cat data1.csv data2.csv data3.csv data4.csv' every ::121::600 using 3:25:43 w pm3d 

Я попробовал это, но кажется, что только данные data1.csv показывает в сюжете. Я что-то делаю с ' или ,? Есть awk, или sed вариант?

Я знаю вариант set table, но я бы предпочел бы, чтобы чистая команда команды bash прямо делала это на лету.

Есть ли хороший ресурс для поиска всех команд unix с некоторыми демонстрациями gnuplot?

Спасибо за ответ: , так что ' предназначены для команды plot: например. plot 'data1.csv' using 1:2 w l будет печатать строку 1 в строке 2 из файла data1 с помощью строк. поэтому я использовал команду ' в команде. Я нашел это Site где эй объяснить команды некоторого Баша для gunplot, но я до сих пор не нашел то, что я ищу

Спасибо за большой и помощь акустического отклика по поводу моей проблемы: Это сработало:

plot '< for i in data1.csv data2.csv data3.csv data4.csv; do cat "$i"; echo; done' every ::121::600 using 3:25:43 w pm3d 

Стоит отметить, что у меня было объявление " вокруг $i как vagoberto предлагаемого

и это работало точно так же:

plot '< awk "FNR==1{print \"\"}1" data1.csv data2.csv data3.csv data4.csv' every ::121::600 using 3:25:43 w pm3d 

оба работали на моей среде Mac OSX Terminal, а на Wind 7 с установленным пакетом gnuWin32.

+2

Я не знаю, о Gnuplot, но ваше описание создает впечатление, что вы, возможно, захотите [процесс замещения] (https://www.gnu.org /software/bash/manual/bash.html#Process-Substitution). Синтаксис: '<(данные кошки * .csv)'. В зависимости от того, требует ли 'splot' поиск во входном файле, это может дать вам ошибку, потому что подстановка процесса в основном возвращает символьное устройство. В Zsh есть альтернативный синтаксис '= (данные cat * .csv)', который дает вам файл для поиска. – 4ae1e1

+0

Спасибо. Является ли это правильным синтаксисом: '' = (cat data1.csv data2.csv data3.csv data4.csv каждый :: 121 :: 600 с помощью 3:25:43 w pm3d' Я пробовал, но я получаю ошибку, что data1 и т. д. не удалось найти –

+1

Я не знаю, почему вы используете одиночные кавычки вокруг =(). Если вы используете одинарные кавычки, то вы больше не используете функции оболочки, поскольку вы передаете токен буквально. я знаю только о gnuplot, я просто говорю по моему опыту с большинством утилит командной строки * nix. Кроме того, как я уже сказал, =() работает только в zsh. – 4ae1e1

ответ

2

Команда every ::121::600 говорит GNUPLOT брать данные из строки 121 до 600 (считая от 0) на каждом блоке , а не на каждый файлов. Вам необходимо предварительно обработать данные для создания блоков (поместите одну строку между данными).

Рассмотрим следующие два файла данных:

#data1.dat   #data2.dat 
1 2     1.5 2.5   # line 0 
3 4     3.5 4.5   # line 1 
5 6     5.5 6.5   # line 2 

и попытаться построить с every ::2::2 (то есть участок только линия 2).

Следующая инструкция создает единый блок, так Gnuplot будет строить только точку (5,6):

cat data1.dat data2.dat 
1 2 
3 4 
5 6 
1.5 2.5 
3.5 4.5 
5.5 6.5 

Следующая инструкция будет создавать блок для каждого файла данных, так что Gnuplot будет строить точки (5,6) и (5.5,6.5):

for i in data*.dat; do cat $i; echo; done 
1 2 
3 4 
5 6 

1.5 2.5 
3.5 4.5 
5.5 6.5 

вы получите такой же результат, используя awk 'FNR==1{print ""}1' data*.dat.

В заключение, следующее должно работать:

plot '< for i in data*.dat; do cat $i; echo; done' every ::2::2 using 1:2 

# or 
plot '< awk "FNR==1{print \"\"}1" data*.dat' every ::2::2 using 1:2 
+0

благодарит много (еще раз) за вашу помощь, поэтому сначала мне нужно собрать все файлы вместе в файл, сформировать блоки, а затем я могу их заметить? Спасибо за вашу помощь, поэтому далеко –

+0

есть ли возможность, что команда cat в gunplay на Mac OS X не работает? –

+0

При попытке 'p lot 'для i в data * .dat; do cat $ i; эхо; done 'every :: 3 :: 3 с помощью 1: 2' я получаю ожидающую {do-clause} ошибку :-(Я снова пытаюсь вернуться в систему Windows. Еще раз спасибо за помощь, –

Смежные вопросы