Поиск совпадающих строк и объединение вывода в одну строку - PullRequest
2 голосов
/ 23 марта 2012

Я хотел бы найти три строки в формате "\d+ [xyz]{3} \d+" в текстовом файле и вывести строки в одну строку, используя sed.


Пример ввода:

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

Вывод:

33 7 3 5

Ответы [ 3 ]

2 голосов
/ 23 марта 2012

Использование 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 голосов
/ 23 марта 2012

В одну сторону с 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 голос
/ 23 марта 2012

Это может работать для вас:

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