2017-04-13 4 views
1

hier ist also mein Code so weit:bash: Lesen von stdin OR Datei awk mit

awk '{++a[length()]} END{for (i in a) print i, a[i]}' <$1 | sort -n 

, die die Längen der Zeilen aus einer Textdatei liest und gibt die Länge der Linie, und dann, wie viele Zeilen haben die gleiche Länge.

So Eingang:

hello 
guys 
hows 
it 
going 

Will Ausgang:

2 1 
4 2 
5 2 

ich es will auch in der Lage sein stdin, so kann ich den Befehl“./script Dateinamen ausgeführt werden. txt "und kann auch den Befehl mit Standardeingabe ausführen.

Gibt es eine Möglichkeit, dies mit einer while-Schleife zu tun? Ich habe versucht, etwas zu tun, ähnlich wie:

while read line 
do 
    awk '{++a[length()]} END{for (i in a) print i, a[i]}' <${1:-/dev/stdin} | sort -n 
done <${1:-/dev/stdin} 

aber nichts scheint richtig ...

Irgendwelche Ideen

arbeiten zu werden?

+0

Wenn Sie uns gesagt, was statt, wie und erzielten Beispieldaten mit dem erwarteten Ausgang wir Ihnen möglicherweise in der Lage zu helfen: Das Folgende wird file1.txt, stdin und file2.txt in dieser Reihenfolge verarbeiten. Wenn Sie es selbst lösen wollen und gleichzeitig von stdin und einer Datei mit awk lesen wollen, verwenden Sie 'getline' für die Datei. Viel Glück. –

+0

Wovon redest du? Sie lesen bereits von stdin! –

Antwort

1

Sie können den Bindestrich (-) als Dateinamen verwenden, awk versteht es als stdin als zu analysierende Datei. Zum Beispiel:

awk '{++a[length()]} END{for (i in a) print i, a[i]}' - 

Auch durch die nicht einen Dateinamen überhaupt spezifizieren, awk verwendet auch stdin

awk '{++a[length()]} END{for (i in a) print i, a[i]}' 

Und beachten Sie, dass Sie beide mischen.

awk '{++a[length()]} END{for (i in a) print i, a[i]}' file1.txt - file2.txt 
+0

Beachten Sie auch, dass die meisten Befehle - wie Standard – kontiki

0

awk kann standardmäßig mit stdin lesen, wenn Sie Daten an awk übergeben.

Sie können Daten aus beiden Datei und stdin wie folgt lesen:

echo $'pipe1\npipe2\npipe3' | awk '{print NR, $0}' file - 

Der Strich am Ende stdin darstellen.