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