搜索匹配的行并将输出组合在一行上

时间:2012-03-23 14:19:27

标签: sed awk

我想在文本文件中搜索格式为"\d+ [xyz]{3} \d+"的三行,并使用sed在一行中输出这些行。


示例输入:

... 
33 xxx 7
...
33 zzz 3
...
33 yyy 5
...

输出:

33 7 3 5

3 个答案:

答案 0 :(得分:2)

sed的一种方式:

script.sed的内容:

## Subbtitute line that matches the format with both numbers.
s/^\([0-9]\+\) [xyz]\{3\} \([0-9]\+\)$/\1 \2/ 

## If substitution succeed, go to label 'a'.
ta

## If substitution failed, go to label 'b'.
bb

## Save content to 'hold space'.
:a
H

## In last line, get content from 'hold space', remove numbers
## not needed in output and print.
:b
$ {
    g   
    s/^\n//
    s/\n[0-9]\+//g
    p   
}

infile的内容:

text 
33 xxx 7
more text
33 zzz 3
55 n
33 yyy 5
66 asf sdf

运行脚本:

sed -nf script.sed infile

输出:

33 7 3 5

答案 1 :(得分:2)

使用awk

script.awk的内容:

$1 ~ /^[[:digit:]]+$/ && $2 ~ /^[xyz]{3}$/ && $3 ~ /^[[:digit:]]+$/ {
    num = $1
    digits = digits " " $3
}

END {
    print num digits
}

infile的内容:

text 
33 xxx 7
more text
33 zzz 3
55 n
33 yyy 5
66 asf sdf

运行脚本:

awk -f script.awk infile

输出:

33 7 3 5

答案 2 :(得分:1)

这可能对您有用:

sed '/^\([0-9]\+ \)[xyz]\{3\} \([0-9]\+\)/{s//\1\2/;H};$!d;g;s/.//;s/\n[0-9]*//g' file
33 7 3 5