2012-04-04 7 views
5

Estoy tratando durante algún tiempo para resolver esto sin éxito hasta el momento tengo una salida de comando que necesito para masticar para que sea adecuado para su posterior procesamientoEstoy desconcertado aquí sobre awk, sed, etc.

El texto que tengo es:

1/2 [3] (27/03/2012 19:32:54) word word word word 4/5 

lo que necesito es extraer sólo los números 1/2 [3] 4/5 lo que se verá:

1 2 3 4 5 

así que, básicamente, yo estaba tratando de excluir todos los personajes th at no son dígitos, como "/", "[", "]", etc. Probé awk con FS, intenté usar regexp, pero ninguno de mis intentos fue exitoso.

Yo agregaría algo como primero: 1 segundo: 2 tercer: 3 .... etc Por favor, tenga en cuenta que estoy hablando de un archivo que contiene mucho si las líneas tienen la misma estructura, pero ya pesar de que sobre el uso de awk para resumir cada columna con

awk '{sum1+=$1 ; sum2+=$2 ;......etc} END {print "first:"sum1 " second:"sum2.....etc}' 

pero primero tendrá que extraer sólo los números correspondientes, La fecha en la que se encuentra entre "()" puede omitirse por completo, pero se trata de números también, por lo que filtrar simplemente por dígitos no será suficiente ya que también los emparejará

Espero que puedas ayudarme ¡Gracias de antemano!

Respuesta

5

Este: sed -r 's/[(][^)]*[)]/ /g; s/[^0-9]+/ /g' debería funcionar. Realiza dos pasadas, elimina primero las expresiones entre paréntesis y luego reemplaza todas las ejecuciones de no dígitos con espacios únicos.

+0

¡EXCELENTE! exactamente lo que necesitaba! Así es como se ve el comando completo el archivo test.txt contiene: '10/20 [30] (fecha) palabra palabra palabra palabra 40/50 10/20 [30] (fecha) palabra palabra palabra palabra 40/50 ' Por lo tanto, al ejecutar: ' cat test.txt | sed -r 's/[(] [^)] * [)]// g; s/[^ 0-9] +// g '| awk '{sum1 + = $ 1; sum2 + = $ 2; sum3 + = $ 3; sum4 + = $ 4; sum5 + = $ 5} END {print "first:" sum1, "second:" sum2, "third:" sum3, "fourth:" sum4, "fifth:" sum5} '' y su salida es: ' first: 20 second : 40 en tercer lugar: 60 en cuarto lugar: 80 en quinto: 100' Muchas gracias @ Michał Kosmulski Ustedes son geniales – TuxSax

+0

Por cierto, ¿hay alguna manera de que los comentarios se vean mejor como respuestas y preguntas? Como bloques de código y sangría, saltos de línea, etc. – TuxSax

+0

De nada. En cuanto al formateo, consulte esta página: http://stackoverflow.com/editing-help#comment-formatting –

2

Puede hacer algo como sed -e 's/(.*)//' -e 's/[^0-9]/ /g'. Borra todo dentro de los corchetes, que sustituye todos los caracteres que no son dígitos con un espacio. Para deshacerse de los espacios extra se puede alimentar a column -t:

$ echo '1/2 [3] (27/03/2012 19:32:54) word word word word 4/5' | sed -e 's/(.*)//' -e 's/[^0-9]/ /g' | column -t 
1 2 3 4 5 
+0

1UP Esto fue más o menos lo que se me ocurrió. – MattH

0

véase más adelante, si es lo que quiere:

kent$ echo "1/2 [3] (27/03/2012 19:32:54) word word word word 4/5"|sed -r 's/\([^)]*\)//g; s/[^0-9]/ /g' 
1 2 3      4 5 

si usted quiere que se vea mejor:

kent$ echo "1/2 [3] (27/03/2012 19:32:54) word word word word 4/5"|sed -r 's/\([^)]*\)//g; s/[^0-9]/ /g;s/ */ /g' 
1 2 3 4 5 
0

Esto le dará los dígitos extraídos excluyendo el texto entre paréntesis:

digits=$(echo '1/2 [3] (27/03/2012 19:32:54) word word word word 4/5' |\ 
     sed 's/(.*)//' | grep -o '[0-9][0-9]*') 
echo $digits 

o pura solución SED:

echo '1/2 [3] (27/03/2012 19:32:54) word word word word 4/5' |\ 
sed -e 's/(.*)//' -e 's/[^0-9]/ /g' -e 's/[ \t][ \t]*/ /g' 

SALIDA:

1 2 3 4 5 
+0

estaba pensando en grep -o [0-9], sin embargo, fallará si el número tiene dos dígitos, como 1/20 [35] ... – Kent

+0

Edité mi respuesta y agregué otra opción basada en pure sed. – anubhava

0
awk '{ first+=gensub("^([0-9]+)/.*","\\1","g",$0) 
     second+=gensub("^[0-9]+/([0-9]+) .*","\\1","g",$0) 
     thirdl+=gensub("^[0-9]+/[0-9]+ \[([0-9]+)\].*","\\1","g",$0) 
     fourth+=gensub("^.* ([0-9]+)/[0-9]+ *$","\\1","g",$0) 
     fifth+=gensub("^.* [0-9]+/([0-9]+) *$","\\1","g",$0) 
     } 
     END { print "first: " first " second: " second " third: " third " fourth: " fourth " fifth: " fifth 
     } 

Podría trabajar para usted.

0

una pasada con awk es suficiente si se establece un separador de campo de lujo: cualquiera de barra, espacio, soporte de abrir o cerrar el soporte separa un campo:

awk -F '[][/ ]' ' 
    {s1+=$1; s2+=$2; s3+=$4; s4+=$(NF-1); s5+=$NF} 
    END {printf("first:%d second:%d third:%d fourth:%d fifth:%d\n", s1, s2, s3, s4, s5)} 
' 
1

TXR:

@(collect) 
@one/@two [@three] (@date @time) @(skip :greedy) @four/@five 
@(filter :tonumber one two three four five) 
@(end) 
@(bind (first second third fourth fifth) 
     @(mapcar (op apply +) (list one two three four five))) 
@(output) 
first:@first second:@second third:@third fourth:@fourth fifth:@fifth 
@(end) 

datos:

1/2 [3] (27/03/2012 19:32:54) word word word word 4/5 
10/20 [30] (27/03/2012 19:32:54) word word 40/50 

de ejecución:

$ txr data.txr data.txt 
first:11 second:22 third:33 fourth:44 fifth:55 

Fácil de añadir un poco de comprobación de errores:

@(collect) 
@ (cases) 
@one/@two [@three] (@date @time) @(skip :greedy) @four/@five 
@ (or) 
@line 
@ (throw error `badly formatted line: @line`) 
@ (end) 
@ (filter :tonumber one two three four five) 
@(end) 
@(bind (first second third fourth fifth) 
     @(mapcar (op apply +) (list one two three four five))) 
@(output) 
first:@first second:@second third:@third fourth:@fourth fifth:@fifth 
@(end) 

$ txr data.txr - 
foo bar junk 
txr: unhandled exception of type error: 
txr: ("badly formatted line: foo bar junk") 
Aborted 

TXR es para la programación robusto. Hay un tipado fuerte, por lo que no puede tratar cadenas como números solo porque contienen dígitos. Las variables tienen que estar vinculadas antes del uso, por lo que las variables mal escritas no se ponen en cero por defecto o en blanco, sino que producen un error de tipo unbound variable <name> in <file>:<line>. La extracción de texto se realiza con un montón de contexto específico para protegerse contra la mala interpretación de la información en un formato como si estuviera en otro formato.

Cuestiones relacionadas