awk
Reihenmanipulation
Suche…
Extrahieren Sie bestimmte Zeilen aus einer Textdatei
Angenommen, wir haben eine Datei
cat -n lorem_ipsum.txt
1 Lorem Ipsum is simply dummy text of the printing and typesetting industry.
2 Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book.
3 It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged.
4 It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum
Wir möchten die Zeilen 2 und 3 aus dieser Datei extrahieren
awk 'NR==2,NR==3' lorem_ipsum.txt
Dadurch werden die Zeilen 2 und 3 gedruckt:
2 Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book.
3 It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged.
Extrahieren Sie eine bestimmte Spalte / ein bestimmtes Feld aus einer bestimmten Zeile
Wenn Sie die folgende Datei haben
cat data.csv
1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
31 32 33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48 49 50
Vielleicht müssen Sie die vierte Spalte der dritten Zeile lesen, dies wäre "24".
awk 'NR==3 { print $4 }' data.csv
gibt
24
Zeilen im laufenden Betrieb ändern (z. B. um Windows-Zeilenenden zu korrigieren)
Wenn eine Datei Windows- oder Unix-ähnliche Zeilenenden (oder sogar eine Mischung aus beiden) enthält, funktioniert die beabsichtigte Textersetzung möglicherweise nicht wie erwartet.
Probe:
$ echo -e 'Entry 1\nEntry 2.1\tEntry 2.2\r\nEntry 3\r\n\r\n' \
> | awk -F'\t' '$1 != "" { print $1 }' \
> | hexdump -c
0000000 E n t r y 1 \n E n t r y 2 .
0000010 1 \n E n t r y 3 \r \n \r \n
000001d
Dies kann leicht durch eine zusätzliche Regel behoben werden, die am Anfang des awk-Skripts eingefügt wird:
/\r$/ { $0 = substr($0, 1, length($0) - 1) }
Da die Aktion nicht mit next endet, werden die folgenden Regeln wie zuvor angewendet.
Beispiel (mit Fix der Zeilenenden):
$ echo -e 'Entry 1\nEntry 2.1\tEntry 2.2\r\nEntry 3\r\n\r\n' \
> | awk -F'\t' '/\r$/ { $0 = substr($0, 1, length($0) - 1) } $1 != "" { print $1 }' \
> | hexdump -c
0000000 E n t r y 1 \n E n t r y 2 .
0000010 1 \n E n t r y 3 \n
000001a
Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow