У меня есть файл с несколькими строками, который структурирован, как показано ниже
MSH|^~\&|Xatidok|V10.0.2.000|OSestra|x-tention|201203060855||ADT^A03|2914|P|2.3^AA&BB
EVN|A03|201203060855|201203060855|01|Fidani
PID|||00019380|2012049008^120005548^302830|PATIDOK-person^InRid^|Rudi|19111111|F|||Rose |A|Pens.
NK1||IRergrun^RROSlf^||Rose ^^Wels^^4600^A|07242123123|||||||||||||||||||||||||||||||
PV1||I|1212^G442^G442-||0|||||||||||2012049008|General|||||||||||||||||||12|||||201202060927|||||||
Таким образом, в основном есть строки с данными, разделенными с помощью каналов (|), и я хочу проанализировать их, написав bashscript.
Итак, вкратце это структура
- Сегмент> строки
- Поле> ячейки между |field |
- Компонент> каждое поле имеет (или не имеет) несколько полей, разделенных ^
- Подкомпонент> разделенных &
Идея запускаСценарий: ./script.sh filename command
команда должна выглядеть следующим образом: MSH.2.3.4 или короче
Значение: получить доступ к полю, которое начинаетсяс MSH, поле № 2, компонент № 3, подкомпонент 4
Итак, моя логика синтаксического анализа заключается в следующем: я хочу создать массив, который будет хранить каждую строку (сегмент) из файла следующим образом:
#!/bin/bash
file_to_be_parsed=$1
command=$2
counter=0
#read the file and split it into lines (segments) by creating an array called segments which holds all the lines (segment) in it
#array segments[] holds every line/segment of the file indexed from 0 to X
while IFS= read -a segment; do
segments[$counter]=$segment
counter=$((counter+1));
done < $file_to_be_parsed
ВТОРОЙ: Мой второй шаг - разделить каждый элемент массива еще на один шаг в зависимости от разделителя, и я могу сделать это следующим образом:
IFS="|" read -r field <<< (here i can't figure out)
, но на самом деле я не могусоздать 2D-массив в Bash, хотя я много искал. Тогда я смогу получить доступ к определенным полям ...
Так может кто-нибудь помочь мне, как разделить эти элементы массива на поля ...