2010-02-25 8 views
4

j'ai un fichier results.txt qui ressemble à:extraction de données à partir d'un fichier

a.txt 
{some data} 
success!! 

b.txt 
{some data} 
success!! 

c.txt 
{some data} 
error!! 

Je veux extraire les données. Je veux une sortie comme:

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

Le problème est que la partie {some data} peut être arbitrairement longue.

Comment cela peut-il être fait?

Répondre

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 

Mise à jour:

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

Vous * pourrait * avoir pris ses accolades trop littéralement :) – vladr

+0

oui, vous pourriez avoir raison. mais qui sait;), dans tous les cas, la deuxième version peut être utilisée. – ghostdog74

0

cat results.txt | grep -E "(([a-z]\.txt)|((success)|(error)!!))" | tr -d '\n' | sed 's/!!/!!\n/' devrait le faire. Vous devrez peut-être remplacer \n avec une nouvelle ligne littérale si.

1

qui fonctionne pour moi:

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

Vous pouvez également utiliser la manière suivante.

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