2016-05-09 9 views
0

Ich habe Hunderte von Zeilen wieauf Worte genaue Anzahl der Zeichen

1234 dfsdfdsfa INIUUININI112123424124 12321 JH7897IUHIH879KJ 

und aus jeder Zeile, mag ich nur Worte mit genau 9 Zeichen (dfsdfdsfa im Beispiel) erhalten. Wie könnte ich es tun?

Ich habe viele regexs/sed/grep/awk ausprobiert, aber ohne Erfolg.

+0

Regex kann es für Sie tun Kannst du Kabeljau teilen? Hast du es versucht? – PseudoAj

Antwort

0

Hier ist eine reine bash Lösung:

filename="test.txt" 
declare -a record 
while read -ra record 
do 
    for field in ${record[@]} 
    do 
     if ((${#field} == 9)) 
     then 
      echo $field 
     fi 
    done 
done < "$filename" 

und hier ist eine awk Lösung in bash eingebettet:

filename='test.txt' 
awk -f - "$filename" << '_END_' 
{ 
    for (i=1; i < NF; i++) { 
     if (length($i) == 9) print $i 
    } 
} 
_END_ 
0
cat foo.txt | sed -e 's/[\t ]/\n/g' | awk '/^.{9}$/ 

auch den Trick tun sollten.

+2

Nutzlose Verwendung von 'Katze'. – cdarke

+0

Das OP zeigte nicht an, wie die Zeilen generiert wurden. 'Cat foo.txt' ist ein Platzhalter für den Prozess, der sie generiert. Hinweis war * foo * drin. –

1

Mit grep:

$ grep -oE '\b.{9}\b' infile 
dfsdfdsfa 

-o gibt nur passt und nicht den kompletten Linien; -E ist, weil ich faul bin und nicht die {} (wie in \{\}) entkommen wollen.

Die Regex selbst ist "beliebige 9 Zeichen zwischen Wortgrenzen". Dies ist nicht gerade narrensicher und würde auch abcd efgh übereinstimmen, die durch die Angabe vermieden werden kann, dass wir nicht leere Zeichen nur wollen:

grep -oE '\b[^[:blank:]]{9}\b' infile 

Statt mit \b...\b, könnten wir die -w Option verwenden, um grep, die die gewährleistet, gleich.

+0

grep hat '-w' Option, um Wörter und' -x' Option zu entsprechen Zeilen – Sundeep

+0

@spasic Ja - aber 'grep -owE '. {9}' würde' abcd efgh' entsprechen, die ich nicht will . Und ich will auch nicht "-x", denn meine Übereinstimmung ist nur ein Wort, nicht die ganze Zeile. –

+0

@spasisch Ah, oder meinst du nur "-w" statt "\ b ... \ b"? Fair genug, das würde funktionieren. –

0

grep mit -w (--word-regexp) Option:

grep -wo '.\{9\}' file.txt 

Beachten Sie, dass, Wortbestand Zeichen sind:

[[:alnum:]_] 

Beispiel:

% grep -wo '.\{9\}' <<<'1234 dfsdfdsfa INIUUININI112123424124 12321 JH7897IUHIH879KJ' 
dfsdfdsfa 
Verwandte Themen