2013-01-22 2 views
26

Ich versuche, die ersten 22 Zeichen aus einer Unix-Datei zu bekommen.Hier sind meine Daten sieht wie folgt aus.Wie bekomme ich die ersten n Zeichen in der Unix-Datei

Die ersten 12 Zeichen sind die Spalte 1 und die nächsten 10 Zeichen die zweite Spalte.

000000000001199998000180000  DUMMY RAG #   MFR NOT ST   1999980 ZZ-   0  0    0ZZ- 
000000000002199998000180000  DUMMY RAG #   MFR NOT ST   1999980 ZZ-   0  0    0ZZ- 
000000000003199998000180000  DUMMY RAG #   MFR NOT ST   1999980 ZZ-   0  0    0ZZ- 
000000000004199998000180000  DUMMY RAG #   MFR NOT ST   1999980 ZZ-   0  0    0ZZ- 
000000000005199998000180000  DUMMY RAG #   MFR NOT ST   1999980 ZZ-   0  0    0ZZ- 
000000000006199998000180000  DUMMY RAG #   MFR NOT ST   1999980 ZZ-   0  0    0ZZ- 
+3

wollen Sie die ersten 2 2 Zeichen der Datei oder die ersten 22 Zeichen jeder Zeile? Sie sollten die Frage ändern, wenn Sie Daten aus jeder Zeile möchten. Wie gewünscht, ist 'dd' das Werkzeug, mit dem Sie die ersten 22 Zeichen aus der Datei erhalten möchten. –

Antwort

56

Mit cut:

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

Wenn ich verstehe, die zweite Forderung wollen Sie die ersten 22 Zeichen in zwei Spalten von Länge spalten 10 und 12 sed ist die beste Wahl für diese:

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

Was macht das -r? Ich habe diesen sed-Befehl versucht, aber ich bekomme einen Fehler, der mir mitteilt, dass -r eine illegale Option ist – interstellar

+0

@interstellar mit GNU sed es schaltet erweiterte reguläre Ausdrücke ein, die äquivalente Option für BSD sed ist -E. –

3

sudo_O schönen Schnitt und sed Lösung zur Verfügung gestellt hat, habe ich einen awk Einzeiler gerade hinzugefügt:

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

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

mit leeren char (es auf Ihrer Anforderung abhängt, wollen Sie die Räume überspringen oder Sie einschließen möchten und sie in Ihrer Ausgabe zu zählen)

wenn Leerzeichen und auch in der Ausgabe angezeigt gezählt werden sollen: (Sie müssen nicht die cmd ändern oben)

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

, wenn Sie diese Räume überspringen wollen: (quick and dirty)

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