【发布时间】:2016-07-21 08:37:08
【问题描述】:
我有许多包含分层相关字符串的文本文件。
编辑这是一个例子。这些文件基本上如下所示
HEBV000000000000
HEH11111111 2222222022HCPP 3333 0000 AAA
HET11111 22222222222222
HEH888888 3333333333HCPP 3333 0000 AAA
HET2222 33333333333333333
HEH44444444 55555555HCPP 4444 0000 BBB
HET555555 0066666666666666666
HEE0019000000090
HEBV0120150301429
HEH5588558888 5555000044440000NCPP 164201503010000 HIP
HER9999A 0157000120150303333
HET8888B 0036400120150303333
HEE0044000000040
细分为:
HEB (start of batch1)
HEH (start of group1)
HET (end of group1)
HEH (start of group2)
HET (end of group2)
HEH (start of group3)
HET (end of group3)
HEE (end of batch1)
HEB (start of batch 2)
HEH (start of group1)
HER (start of subgroup1)
HET (end of group1)
HEE (end of batch2)
字符串以几种方式相关:
HEB 字符串表示批次的开始。 HEE 详细列出了上一批中的 HEH、HER 和 HET 记录数。
下一个关系是文档的核心,即 HER 和 HET 记录与单个 HEH 相关。批次(HEB 到 HEE)可以包含多个 HEH-HER-HET 组。一批中总会有至少一个 HEH-HET 组;可能有很多。如果存在 HER 记录,则它与它之前的 HEH 以及它之后的所有 HET 相关,直到遇到新的 HER 或 HEH。因此 HER 和 HET 记录只与单个 HEH 记录相关,但 HEH 记录可以与多个 HER 和 HET 记录相关联。
任何字符串中都没有链接标识符。唯一可用的关系是文件中字符串的位置。 (不是我做的,我无法改变)
我想做的是有一个基于 HET 记录的输出文件,如下所示,以便我可以导入到统计数据包中(请注意,我的意思是从每一行打印整个字符串,但对于易于阅读我只是显示字符串的 HE*):
HET1 HEH1 HEB FILENAME HEE
HET2 HEH2 HER2 HEB FILENAME HEE
HET3 HEH3 HER3 HEB FILENAME HEE
等等。
我认为它会如何工作的逻辑是:
Read in the file
Get filename and append to HEB records
Then
Look for HEB record and store
Look for HEE record and store
Append HEB and HEE to HEH
if new HEB is found repeat above until end of file
Then
Look for HEH record and store
Append to HET records until an HEH or HEE record is found
if a new HEH is found, append it to HET records until HEH or HEE is found
repeat until eof
Then
Look for HER record and store
Append to HET records until an HER, HEH or HEE record is found
if a new HER is found, append it to HET records until an HER, HEH or HEE record is found
repeat until eof
save to new file
我认为这会让我进入
HET1 HEH1 HEB FILENAME HEE
HET2 HEH2 HER2 HEB FILENAME HEE
HET3 HEH3 HER3 HEB FILENAME HEE
我之前对类似格式的文件提出了类似的问题:
和
bash & awk: Loop through dir running two separate awk commands on all files and saving in new dir
不幸的是,由于多层关系,这些文件更加复杂。这超出了我从其他问题修改解决方案的能力
代码:
for f in *txt
do
awk '/^AB1/{ab1=$0;next}/^AB2/{print $1, $2, ab1}' "$f" > "new$f"
awk '{print $1,$2,$3,$4,$5,$6,FILENAME}' "new$f" > "newnew$f"
done
我不知道在这里 awk 是否是一个好主意,或者像 Perl 或 Java 这样的东西是否会更好。正如我在其他问题中提到的那样,我是一名医生,而不是程序员,虽然我可以通过一些理解来修改代码(通常是绊倒我的脚),但当我遇到这样的事情时,我发现自己远远超出了我的深度.
【问题讨论】:
-
我自己会在
perl做这件事——但我也很难听懂你的问题。你能提供一些样本(经过清理的)输入和所需的输出吗? -
感谢您的回复。该文件看起来像问题中的第一个块,即:`HEB 行然后 HEH 行然后 HET 行,字符串更长,但每行的开头是 HEB、HEH、HER、HET 或 HEE。就是这样,一直到文件。
-
“一个 HEH 记录可以与多个 HER 和 HET 记录相关联。” 您确定吗?如果 HEH 和 HET 记录以与 HEB 和 HEE 记录相同的方式配对,则数据格式更有意义。我可以理解可能有多个 HER 记录,按照 HEH HER HER HER HER HET 之类的顺序,但您说的也可能有多个 HET 记录,例如 HEH HER HET HER HET HER HER HET
-
As Sobrique has asked, “你能给出一些样本(经过清理的)输入和所需的输出吗?”从样本输入中查看您期望的确切输出
-
第一批代码是一个实际的文件输出,保存了一些数字和字母的更改以使其脱敏。 HEB 是批次标题。 HEE 是批处理页脚。 HER 与前面的 HEH 绝对相关,如果出现 HEH,HER 总是跟随在 HEH 之后。通常只有 HEH 和 HET 记录出现在一个批次中,但 HER 记录的罕见情况只会为该 HEH 添加更多信息。 HEH 是一个帐户规范字符串。 HET 记录是属于它/它们之前的 HEH 下的项目。