匹配模式并使用匹配的字符串追加每一行

时间:2014-07-14 19:02:48

标签: bash unix awk sed

匹配模式并使用匹配的字符串追加每一行,直到下一个匹配。 WES和GET2在以下示例中匹配: 我知道如何进行一种模式

awk '$1~/WES/{A=$1}{print A,$0}'

但不知道如何处理两种模式:

输入:

WES S1 S2 SET3
S2 S4 S5
D3 D7 F2
GET2 F4 S3 64
SES2 32 Q3
Y67 98 GT1
WES S2 S4 SET3
S2 S4 S5
D3 D7 F2

输出:

WES WES S1 S2 SET3
WES S2 S4 S5
WES D3 D7 F2
GET2 GET2 F4 S3 64
GET2 SES2 32 Q3
GET2 Y67 98 GT1
WES WES S2 S4 SET3
WES S2 S4 S5
WES D3 D7 F2

2 个答案:

答案 0 :(得分:1)

awk '$1 ~ /^(WES|GET2)$/{ p = $1 FS }{ print p $0 }' file.txt

输出:

WES WES S1 S2 SET3
WES S2 S4 S5
WES D3 D7 F2
GET2 GET2 F4 S3 64
GET2 SES2 32 Q3
GET2 Y67 98 GT1
WES WES S2 S4 SET3
WES S2 S4 S5
WES D3 D7 F2

其他变体:

awk '$1 ~ /^(WES|GET2)$/{ p = $1 }{ print p FS $0 }' file.txt
awk '$1 ~ /^(WES|GET2)$/{ p = FS $1 }{ $0 = p $0 } 1' file.txt
awk '$1 ~ /^(WES|GET2)$/{ p = $1 }{ $0 = p FS $0 } 1' file.txt

答案 1 :(得分:0)

$ awk 'match($1,/WES|GET2/){A=substr($1,RSTART,RLENGTH)} {print A,$0}' file
WES WES S1 S2 SET3
WES S2 S4 S5
WES D3 D7 F2
GET2 GET2 F4 S3 64
GET2 SES2 32 Q3
GET2 Y67 98 GT1
WES WES S2 S4 SET3
WES S2 S4 S5
WES D3 D7 F2

顺便说一下,前面的文字是prepending,而不是appending附加到最后的文字。