Как дать многомерному массиву значение для каждой ячейки,

Я вообще не программист, но мне нужно написать скрипт для вырезания файла и создания многомерного массива из этого файла.

Я химик, поэтому мой массив должен быть чем-то вроде:

[pe][pH][element][concentration]. 

Таким образом, я смогу построить изменение концентрации для одного элемента с pH и pe .

Поэтому я написал этот скрипт, чтобы сократить свой входной файл и индекс pe , pH и виды, но теперь я застрял. Я не знаю, как это сделать.

  #!/bin/bash inputFile='test.inp' awk '/Distribution of species/ {f=1} /Saturation indices/ {f=0} f' $inputFile > distriPack.inout csplit -z -f distri_ distriPack.inout /Distribution/ {*} sed -i '1,5d; $d' distri_* sed -i 's/^ *//' distri_* cut -d ' ' -f1 distri_* | sort | uniq > especes.inp grep -E "pH = " $inputFile | cut -d '=' -f 2 | cut -d ' ' -f 4 > ph.inp grep -E "pe = " $inputFile | cut -d '=' -f 2 | cut -d ' ' -f 4 > pe.inp declare -a tableVariable=(ipe ipH ies) ipe=0 tablepe=0 for pe in cat "$pe.inp" do if ([ $ipe -eq 0 ] || pePrev=pe) then tablepe=$((tablepe+1)) ipe=$((ipe+1)) pePrev=$pe fi ipH=0 tablepH=0 for pH in cat "$pH.inp" do if ([ $ipH -eq 0 ] || pHPrev=pH ) then tablepH=$((tablepH+1)) > tablepH.inp ipH=$((ipH+1)) pHPrev=$pH fi ies=0 tablees=0 for espece in cat "$espece.inp" do if ([ $ies -eq 0 ] || especePrev=espece ) then # indEspece=0 # for espece in distri_$pe # do # if ([ $indEspece -eq 0 ]) maVariable= grep -E "espece" < distri_10 | cut -d ' ' -f 1 ${tableVariable[ $((ipe)) $((ipH)) $((ies)) ]}=$((maVariable)) # done ies=$((ies+1)) tablees=$((tablees+1)) especePrev=$espece fi done done done 

val = $ {monTableau [$ {i_pe} $ {i_pH} $ {es} $ {pa}]}> monTableau.inp

Я хотел бы иметь что-то вроде: for [pe][pH][specie]=[0][12][15]

IndexTable = концентрация.

Но я не знаю, как сказать в bash for pe = i, pH = j и specie=k и do indexTable[i][j][k]=value вторых столбцов файла Distri_ (показатель pe / pH значение) для строки, соответствующей типу индекса k. Здесь у вас есть «некоторые» строки из моего входного файла:

  >Initial solution 1. \newline >Description of solution >pH = 0.0 >pe = 0.0 >Distribution of species >Species Molality log Activity >H+ 1.1e+00 1.0e+00 >OH- 1.5e-14 9.5e-15 >Am+2 0.0e+00 0.0e+00 >Initial solution 2. pe 0 pH 0.5 >Description of solution >pH = 0.5 >pe = 0.0 >Distribution of species >Species Molality Log Activity >H+ 4.1e-01 3.1e-01 >OH- 4.5e-14 3.1e-14 >Am+2 0.0e+00 0.0e+00 

Я хотел бы получить что-то вроде этого: outputfile_ [pe value] .out, где будут упорядочены данные:

  >Column 1 C2 ..... Cn >Specie\pH 0 n >H+ [H+] at pH=0 [H+] at pH=n 

и т.д

One Solution collect form web for “Как дать многомерному массиву значение для каждой ячейки,”

Я не уверен, хотите ли вы напечатать знак «>» на выходе или если он существует на входе … Пожалуйста, дайте мне отзыв, чтобы я мог внести исправления в скрипт.

Это должно выполняться, если вход и выход точно так, как вы описали:

 #!/usr/bin/awk { # Set the INDEX for each 'Initial Solution' if ($1==">Initial"){ gsub(/\./,"",$3); INDEX=$3;} #Discard lines with 'Species' or 'Description' if (($1==">Description")||($1==">Species")) next; #Remove '>' from the first field gsub(/>/,"",$1) #Set the labels of the rows PH[0]="Column" PE[0]="Specie\\ph" H[0]="H+" OH[0]="OH-" AM[0]="Am+2" #Set other values (pH, pe, etc) if ($1=="pH") PH[INDEX]=$3 if ($1=="pe") PE[INDEX]=$3 if ($1=="H+") H[INDEX]=$2" "$3 if ($1=="OH-") OH[INDEX]=$2" "$3 if ($1=="Am+2") AM[INDEX]=$2" "$3 } # Print each array. END { for (i = 0; i <= INDEX; i++) printf("%s\t",i) printf("\n") for (i = 0; i <= INDEX; i++) printf("%s\t",PH[i]) printf("\n") for (i = 0; i <= INDEX; i++) printf("%s\t",PE[i]) printf("\n") for (i = 0; i <= INDEX; i++) printf("%s\t",H[i]) printf("\n") for (i = 0; i <= INDEX; i++) printf("%s\t",OH[i]) printf("\n") for (i = 0; i <= INDEX; i++) printf("%s\t",AM[i]) printf("\n") } 

Некоторые примечания:

  1. Первая строка (#! / Usr / bin / awk) должна указывать на местоположение awk на вашем компьютере (попробуйте whereis awk в whereis awk строке)
  2. В последнем блоке \ t вставляет вкладку между полями. Вы можете заменить его на \ t \ t на 2 вкладки, запятую ',' или просто пробел '' в соответствии с вашими потребностями.
  3. Сохраните этот скрипт и используйте его, просто выполните: awk -f script.name.awk input.file.inp

    Надеюсь, это решит вашу проблему.

  • Интерактивный скрипт bash
  • Добавить временные метки для вывода команды «top»
  • Удаление соответствующей строки в файле не работает
  • bash, который читает ввод пользователя и использует команду «cal» для проверки дат
  • Загрузка с динамически изменяющихся URL-адресов через скрипт
  • Как вырезать каждую строку из определенной строки?
  • Команда cat не работает внутри сценария оболочки
  • Копирование новейших файлов
  • Как найти конкретную строку и распечатать всю строку?
  • Bash завершает дополнительное пространство при добавлении каталога файлов
  • Окно GTK gtkdialog для создания ссылки
  • Interesting Posts

    Получить строки, соответствующие шаблону в одном файле, и поместить их во второй файл, соответствующий одному шаблону

    Эквивалент Unix / Linux для проверки обхода байпаса Windows

    Как войти в систему через tty

    Как подключиться к OpenVPN с помощью NetworkManager

    Как я могу обратиться к полю awk, определенному с помощью произвольного выражения?

    смонтировать Linux NFS. rpc.statd не работает

    отображать только файлы, начиная с. (скрытый)

    разделить содержимое определенного столбца

    Не разрешено добавлять eth0 в bond0

    Подключить символическую ссылку к программе или скрипту, который возвращает файл

    Почему я не могу изменить имя хоста моего сервера с помощью sudo?

    Выполнить vsim из dmenu – он работает только при непосредственном вызове в терминале

    Установка Dropbox застряла с разрешением

    Адаптер Wi-Fi не найден, я все еще использую Wi-Fi. Моя настройка «Проводная» подключена, но у меня нет сетевого шнура

    Почему я не могу изменить оболочку командой chsh?

    Linux и Unix - лучшая ОС в мире.