需要SED和/或awk帮助

需要SED和/或awk帮助,sed,awk,Sed,Awk,我正在使用openvms,但在此平台上可以访问aWk和/或sed版本。想知道是否有人可以帮助处理文本文件 我的文件看起来像 START-OF-DATA Stock ID|XYZ START-TIME 11:30 END_TIME 12:30 11:31|BID|12.5|ASK|12.7 11:34|BID|12.6|ASK|12.7 END-OF-DATA START-OF-DATA Stock ID|ABC START-TIME 11:30 END_TIME 12:30 11:40|BID|

我正在使用openvms,但在此平台上可以访问aWk和/或sed版本。想知道是否有人可以帮助处理文本文件

我的文件看起来像

START-OF-DATA
Stock ID|XYZ
START-TIME 11:30
END_TIME 12:30
11:31|BID|12.5|ASK|12.7
11:34|BID|12.6|ASK|12.7
END-OF-DATA
START-OF-DATA
Stock ID|ABC
START-TIME 11:30
END_TIME 12:30
11:40|BID|.245|ASK|.248
11:34|BID|.246|ASK|.249
END-OF-DATA
基本上,我想用
Stock ID
预先挂起
BID/ASK
数据记录,因此上面的文件应该如下所示

START-OF-DATA
Stock ID|XYZ
START-TIME 11:30
END_TIME 12:30
XYZ|11:31|BID|12.5|ASK|12.7
XYZ|11:34|BID|12.6|ASK|12.7
END-OF-DATA
START-OF-DATA
Stock ID|ABC
START-TIME 11:30
END_TIME 12:30
ABC|11:40|BID|.245|ASK|.248
ABC|11:34|BID|.246|ASK|.249
END-OF-DATA
有人能帮忙吗?

像这样:

awk -F'|' 'BEGIN{OFS="|"} /^Stock/{S=$2}  /BID|ASK/{print S,$0}' file
解释(感谢奥利维尔·杜拉克)

每次遇到一行用“Stock”表示的变量时,它都会更新“S”,然后在包含“BID”或“ASK”的行前面加上S(使用|作为读取和输出的分隔符)。

尝试以下方法:

awk -F'|' 'NF==2{pre=$2}NF>2{$0=pre FS $0}7' file
它适用于给定的示例。

使用awk

awk '/Stock ID/{s=$2}/BID|ASK/{$0=s FS $0}1' FS=\| file

START-OF-DATA
Stock ID|XYZ
START-TIME 11:30
END_TIME 12:30
XYZ|11:31|BID|12.5|ASK|12.7
XYZ|11:34|BID|12.6|ASK|12.7
END-OF-DATA
START-OF-DATA
Stock ID|ABC
START-TIME 11:30
END_TIME 12:30
ABC|11:40|BID|.245|ASK|.248
ABC|11:34|BID|.246|ASK|.249
END-OF-DATA
这可能适用于您(GNU-sed):


Stock ID
保存在保留空间中,并将其预先添加到包含
BID
ASK

+1的记录中。(每次遇到带有“Stock”的行时,它都会更新“S”变量,然后在包含“BID”或“ASK”的行前加上S(使用|作为读取和输出的分隔符)奥利维尔:谢谢。我正要添加一个描述-如果您同意,我会将您的描述添加到我的答案正文中,供大家查看。如您所愿:)[我应该给你时间添加它…我这样做只是为了以防万一你不会^^]谢谢你的建议。我现在有了我需要的所有答案。干杯确保你接受帮助你解决问题的答案。你可以通过单击答案旁边的勾号来完成。
sed -r '/Stock ID/h;/BID|ASK/{G;s/(.*)\n.*\|(.*)/\2|\1/}' file