GNU/Linux >> LINUX-Kenntnisse >  >> Linux

So erhalten Sie die ersten n Zeichen jeder Zeile in einer Unix-Datendatei

Dies kann tatsächlich in Bash durchgeführt werden, ohne externe Programme zu verwenden (Skripte, die dies verwenden, müssen mit #!/bin/bash beginnen statt #!/bin/sh und ist nicht POSIX-Shell-kompatibel) mit dem Ausdruck ${VARIABLE:offset:length} (wobei :length ist optional):

#!/bin/bash

STR="123456789"

echo ${STR:0:1}
echo ${STR:0:5}
echo ${STR:0:10}
echo ${STR:5:10}
echo ${STR:8:10}

wird diese Ausgabe haben:

1
12345
123456789
6789
9

Beachten Sie, dass der Start-Offset bei null beginnt und die Länge mindestens eins sein muss. Sie können auch einen Offset von der rechten Seite der Zeichenfolge verwenden, indem Sie einen negativen Offset in Klammern verwenden:

echo ${STR:(-5):4}

5678

Um eine Datei zu lesen, rufen Sie die ersten 8 Zeichen wiederholt für jede Zeile ab und geben Sie sie an das Terminal aus, verwenden Sie einen while Schleife wie folgt:

while read LINE
    do echo "${STD:0:8}"
done < "/path/to/the/text_file"

Eine äußerst nützliche Quelle für alles, was Sie über die Manipulation von Bash-Strings wissen müssen, finden Sie hier:https://tldp.org/LDP/abs/html/string-manipulation.html


Mit cut :

$ cut -c-22 file
0000000000011999980001
0000000000021999980001
0000000000031999980001
0000000000041999980001
0000000000051999980001
0000000000061999980001

Wenn ich die zweite Anforderung verstehe, möchten Sie die ersten 22 Zeichen in zwei Spalten der Länge 10 und 12 aufteilen. sed ist dafür die beste Wahl:

$ sed -r 's/(.{10})(.{12}).*/\1 \2/' file
0000000000 011999980001
0000000000 021999980001
0000000000 031999980001
0000000000 041999980001
0000000000 051999980001
0000000000 061999980001

sudo_O hat eine nette Schnitt- und Sed-Lösung bereitgestellt, ich habe gerade einen awk-Einzeiler hinzugefügt:

awk 'BEGIN{FIELDWIDTHS="22"} {print $1}' file

echo "000000000001199998000180000     DUMMY RAG"|awk 'BEGIN{FIELDWIDTHS="22"} {print $1}'
0000000000011999980001

mit leerem Zeichen (es hängt von Ihren Anforderungen ab, Sie möchten die Leerzeichen überspringen oder Sie möchten sie in Ihre Ausgabe aufnehmen und zählen)

wenn auch Leerzeichen mitgezählt und ausgegeben werden sollen:(Sie müssen das obige cmd nicht ändern)

echo "0 0 0 0 00000001199998000180000"|awk 'BEGIN{FIELDWIDTHS="22"} {print $1}'                                                                         
0 0 0 0 00000001199998

wenn Sie diese Leerzeichen überspringen möchten:(quick and dirty)

echo "0 0 0 0 00000001199998000180000"|sed 's/ //g'|awk 'BEGIN{FIELDWIDTHS="22"} {print $1}'                                                            
0000000000011999980001

Linux
  1. Wie bereinigt man Dateierweiterungen?

  2. Wie kann man jede Menüauswahl in 1 Zeile anstelle von Mehrfachauswahlen in 1 Zeile treffen?

  3. Wie analysiert man jede Zeile einer Textdatei als Argument für einen Befehl?

  4. So fügen Sie jeder Zeile einer kontinuierlich geschriebenen Protokolldatei eine Datumszeichenfolge hinzu

  5. unix - Anzahl der Spalten in der Datei

So lesen Sie eine Datei Zeile für Zeile in Bash

So konvertieren Sie eine Windows-Datei in eine UNIX-Datei

Wie fügt man Text vor der ersten Zeile einer Datei ein?

Wie füge ich alle vier Zeichen in einer langen Zeile ein Leerzeichen ein?

Wie Echo in Datei

unix - teilt eine riesige .gz-Datei zeilenweise auf