2016-04-13 5 views
1

Ich möchte jede Zahl in Klammern "[]" finden und alle ihre Erscheinungen (Zeilennummern) in Textdatei drucken .Ubuntu, Bash, awk, reguläre Ausdrücke -> finde alle [Zahlen] in der Textdatei und drucke sie

Zum Beispiel habe ich Textdatei wie folgt aus:

texttexttext[1] textetxtetete[2] 
[1]textextetetete[3] 
texttexttext[2] 
texttexttext 
text[3]text[1] 

Und der Ausgang dieses sein sollte:

[1] = lines : 1 2 5 
[2] = lines : 1 3 
[3] = lines : 2 5 

Das ist, was ich bisher getan habe:

#!/bin/bash 
cat $1 | awk -F'[/[/] ]' '{  #[] as file separators 
for (i=1;i<=NF;i++)    #for every part of line 
    { 
    if ($i ~ "[0-9]+")   #if its number 
    { 
     #save it somehow 
    } 
}}' 

Das Skript findet die gewünschten Zahlen, aber jetzt möchte ich es speichern, und seine Zeilennummer (NR-Variable) auf eine einfache Art und Weise. Soll ich etwas mit Arrays ausprobieren? Ich würde mindestens zweidimensionale Arrays benötigen, aber sie sind ein bisschen problematisch in bash. Gibt es einen besseren Weg?

+0

'awk' nicht wahr mehrdimensionale Arrays unterstützt, aber' gawk' tut (wenn auch mit ein paar Knicke). Wenn Sie nicht mehrere Befehle aneinanderreihen wollen, müssen Sie etwas mit vernünftiger mehrdimensionaler Array-Unterstützung verwenden. –

Antwort

2

ist hier eine Lösung awk verwenden (und ein eindimensionales Array)

awk -F"[\],\[]" '{ 
for (i=1;i<=NF;i++) 
    { 
    if ($i ~ "[0-9]+") 
    { 
     arr[$i]=arr[$i]" "NR 
    } 
    } 
} 
END{for(i in arr){print "["i"] lines : " arr[i]}}' t.txt 

Output:

[1] lines : 1 2 5 
[2] lines : 1 3 
[3] lines : 2 5 

Bemerkung: Die regex [0-9]+ Einstimmungen auch Zeichenketten enthalten Zeichen (z.B. 4a). Wenn Ihre Eingabedatei etwas wie [45a] enthält und Sie dies ausschließen möchten, ändern Sie Ihre Regex in ^[0-9]+$.

+0

Wow. Langsames Klatschen ... Du bekommst eine Verbesserung, es ist nicht in Ordnung, aber wen interessiert das, ich werde das retten! –

+1

@JavierBuzzi: Danke! –

+0

Array-Indizes als Dateizeilen, gute Idee. Problem gelöst :) – Piodo

0

Hier ist eine Variation mit gawk des FPAT und sorted_in:

BEGIN { # define fields via FPAT and sort order 
     FPAT="\[[0-9]+\]" 
     PROCINFO["sorted_in"] = "@ind_str_asc" 
     } 
    { for (i = 1; i <= NF; i++) occ[ $i ] = occ[ $i ] " " FNR } 

    END { for(i in occ) printf("%s = lines : %s\n", i, occ[ i ]) }