Verwenden von awk

Verwenden von awk

Ich frage mich, wie ich das Ende der Datei in einer while-Schleife prüfen kann. Was ich hier mache, ist, wenn es ein Wort wie „Ananas“, „Apfel“, „Zwiebel“, „Orange“ usw. gibt, möchte ich Zeilen mit bestimmten Wörtern finden, indem ich den Befehl grep verwende und den Kommentar „Fenster“ hinzufüge. Wenn ich beispielsweise verwende grep 'a' 'file', werden „Ananas“, „Apfel“ und „Orange“ gefunden. Dann möchte ich es schließlich als „Ananas, Fenster, Apfel, Fenster, Orange, Fenster“ oder so etwas ausgeben. Also möchte ich eine Bedingung in einer while- oder for-Schleife erstellen. Jede Hilfe ist sehr willkommen.

bearbeiten: Beispieleingaben

apple
banana
pineapple
orange
mandu
ricecake
meat
juice
milk
onion
green onion

Erwartete Ausgaben bei Verwendung des Grep-Befehls -->grep 'a' 'file name'

apple
window
banana
window
pineapple
window
orange
window
mandu
window
ricecake
window
meat
window

Antwort1

Verwenden von awk

So drucken Sie windownach jeder übereinstimmenden Zeile a:

$ awk '/a/{print; print "window"}' filename
apple
window
banana
window
pineapple
window
orange
window
mandu
window
ricecake
window
meat
window

Wie es funktioniert

/a/{...}wählt Zeilen aus, die dem regulären Ausdruck entsprechen a. Für jede solche Zeile werden die Befehle in geschweiften Klammern ausgeführt.

printdruckt die Zeile mit der Übereinstimmung

print "window"druckt window.

Verwenden von sed

$ sed -n '/a/{s/$/\nwindow/; p}' filename
apple
window
banana
window
pineapple
window
orange
window
mandu
window
ricecake
window
meat
window

Wie es funktioniert

-nweist sed an, nicht zu drucken, es sei denn, wir fordern es ausdrücklich auf.

/a/{...}wählt Zeilen aus, die dem regulären Ausdruck entsprechen a. Für diese Zeilen werden die Befehle in geschweiften Klammern ausgeführt.

s/$/\nwindow/fügt eine neue Zeile windownach dem Ende der aktuellen Zeile hinzu.

pdruckt.

Antwort2

$ grep 'a' file | sed 'a\window'
apple
window
banana
window
pineapple
window
orange
window
mandu
window
ricecake
window
meat
window

Dies verwendet Ihren ursprünglichen grepBefehl und hängt dann das Wort windownach jeder resultierenden Zeile mit dem aBefehl („append“) in GNU an sed(standardmäßig sedist eine neue Zeile nach dem „ \und“ am Ende des eingefügten Textes erforderlich, aber GNU sedist etwas nachsichtiger).

Alternativ können Sie nur GNU verwenden sed:

$ sed -n -e '/a/{p;a\window' -e '}' file
apple
window
banana
window
pineapple
window
orange
window
mandu
window
ricecake
window
meat
window

Der sedAusdruck druckt jede Zeile, die den Buchstaben enthält, aund hängt dann die Zeichenfolge an window.

Antwort3

Die Shell-Methode kann folgendermaßen verwendet werden:

while IFS= read -r line || [ -n "$line" ]; do
    case "$line" in
        *a*) printf "%s\nwindow\n" "$line"
    esac
done < input.txt

Dies kombiniert die typische while IFS= read -r line; do...done < file.txtSchleife zum Lesen von Dateien, caseAnweisungen zum Abgleichen von Zeilen, die bestimmte Zeichen enthalten, und printfzum Drucken dieser zusätzlichen windowZeile.

verwandte Informationen