需要SED和/或awk帮助

时间:2014-03-14 10:12:12

标签: 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|.245|ASK|.248
11:34|BID|.246|ASK|.249
END-OF-DATA

基本上我想将BID/ASK数据记录与Stock ID预先挂起,以便上面的文件看起来像

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

任何人都可以帮忙吗?

4 个答案:

答案 0 :(得分:2)

像这样:

awk -F'|' 'BEGIN{OFS="|"} /^Stock/{S=$2}  /BID|ASK/{print S,$0}' file

解释(感谢Olivier Dulac)

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

答案 1 :(得分:0)

试试这个:

awk -F'|' 'NF==2{pre=$2}NF>2{$0=pre FS $0}7' file

它适用于给定的示例。

答案 2 :(得分:0)

使用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

答案 3 :(得分:0)

这可能适合你(GNU sed):

sed -r '/Stock ID/h;/BID|ASK/{G;s/(.*)\n.*\|(.*)/\2|\1/}' file

Stock ID保存在保留空间中,并将其添加到包含BIDASK的记录中。