2010-02-25 4 views
4

У меня есть файл, который results.txt как:Извлечение данных из файла

a.txt 
{some data} 
success!! 

b.txt 
{some data} 
success!! 

c.txt 
{some data} 
error!! 

Я хочу, чтобы извлечь из него данные. Я хочу, чтобы выход, как:

a.txt: success 
b.txt: success 
c.txt: error 

Проблема в том, что {some data} часть может быть сколь угодно долго.

Как это можно сделать?

ответ

2
$ cat file 
a.txt 
{some 
    blah 
data} 
success!! 

b.txt 
{some data} 
success!! 

c.txt 
{some data} 
error!! 

$ awk 'BEGIN{ FS="[{}]|\n";RS=""}{gsub(/!!/,"",$NF);print $1":"$NF}' file 
a.txt:success 
b.txt:success 
c.txt:error 

Update:

$ awk -vRS= -vFS="\n" '{print $1":"$NF}' file 
a.txt:success!! 
b.txt:success!! 
c.txt:error!! 
+0

Вы * возможно * приняли его в фигурные скобки слишком буквально :) – vladr

+0

да, вы правы. но кто знает;), во всяком случае, можно использовать вторую версию. – ghostdog74

0

cat results.txt | grep -E "(([a-z]\.txt)|((success)|(error)!!))" | tr -d '\n' | sed 's/!!/!!\n/' должен это сделать. Возможно, вам придется заменить \n на буквенную строку новой строки.

1

Это работает для меня:

cat result.txt | xargs |sed 's/\ {[^}]*}/:/g' | sed 's/!! /\n/g' 

a.txt: success 
b.txt: success 
c.txt: error!! 
3

AWK:

BEGIN { 
    state=0 
} 

state==0 && /.txt$/ { 
    filename=$0 
    state=1 
    next 
} 

state==1 && /!!$/ { 
    print filename ": " gensub(/!!$/, "", $0) 
    state=0 
    next 
} 
2

Вы можете использовать следующий путь также.

sed -e 's/^{some data}$//g;/^$/d;' results.txt | sed '$!N;s/\n/: /' 

 Смежные вопросы

  • Нет связанных вопросов^_^