【发布时间】:2020-02-09 22:04:12
【问题描述】:
我有一个包含多行的文件,其结构如下所示
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|||||||
所以基本上有数据行用管道 (|) 分隔,我想通过编写 bash 脚本来解析它们。
简单来说就是这个结构
- 段 > 行
- 字段> |之间的单元格字段 |
- 组件 > 每个字段有(或没有)几个用 ^ 分隔的字段
- 子组件 > 用 & 分隔
运行脚本的思路是:./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)
但我实际上无法在 bash 中创建二维数组,即使我搜索了很多。 然后我可以访问特定的字段...
那么有人可以帮助我如何进一步将这些数组成员分成字段...
【问题讨论】:
-
Bash 不能做嵌套数据结构。像 Python 这样的通用编程语言会更好。
-
@wjandrea 是的,Python 有专门的解析库,但我必须在 bash 脚本中进行。这是强制性的
-
请编辑您的 Q 以显示来自示例输入的所需输出。祝你好运。
-
@Albion 嗯,所以我认为最好的办法是避免嵌套数据结构,只需为每个选定字段创建一个数组,即
MSH.2.3.4,找到以@987654327 开头的行@,然后拆分它并选择第二个元素,然后拆分它,等等。 -
查看Awk Tutorial 并查看
-F选项(用作-F\|,然后使用split(),使用split(string,targArr,"^")(用于分割的字符)。祝你好运。