2009-08-14 18 views
1

Ich möchte in der Lage sein, eine Datei zu sortieren, aber nur in einer bestimmten Zeile und darunter. Von der manuellen Sortierung kann der Inhalt nicht analysiert werden, deshalb brauche ich ein zweites Dienstprogramm, um dies zu tun. lesen? oder awk möglicherweise? Hier wird die Datei ist würde ich sortieren können, mag:Datei beginnend bei einer bestimmten Zeile sortieren

tar --exclude-from=$EXCLUDE_FILE --exclude=$BACKDEST/$PC-* \ 
-cvpzf $BACKDEST/$BACKUPNAME.tar.gz \ 
/etc/X11/xorg.conf \ 
/etc/X11/xorg.conf.1 \ 
/etc/fonts/conf.avail.1 \ 
/etc/fonts/conf.avail/60-liberation.conf \ 

Also für diesen Fall, würde ich gerne auf Linie beginnen Sortierung drei. Ich denke, ich werde eine Funktion zu tun haben, um diese etwas zu tun, wie

cat backup.sh | while read LINE; do echo $LINE | sort; done 

recht neu in diesem und das Skript sieht aus wie es ist etwas fehlt. Auch nicht sicher, wie man bei einer bestimmten Zeilennummer beginnt.

Irgendwelche Ideen?

Antwort

3

So ähnlich?

(head -n 2 backup.sh; tail -n +3 backup.sh | sort) > backup-sorted.sh 

Sie müssen die letzte Zeile des Eingangs fixup können ... es wahrscheinlich nicht über den Hinter \ für die Linie Fortsetzung, so dass Sie vielleicht einen gebrochen ‚backup-sorted.sh‘, wenn Sie mach einfach das obige.

Vielleicht möchten Sie die mit tar --files-aus betrachten (oder T) Option und mit der sortierten Liste von Dateien in einer Datendatei selbst anstelle des Skripts.

+0

tail hat einen +4 ... ahhhhh. –

+0

Ja, aber nach dem erneuten Lesen der Frage, würden Sie -n +3 wollen. Aber ich vermute, dass die Verwendung von --files-from ein besserer Ansatz für Sie wäre. – retracile

+0

Ich entdeckte, dass dies ein bisschen nach Steves Vorschlag getrimmt werden kann: 'tail -n +3 backup.sh | sort -o Sicherung.sh '. Doing --files-from = ... ist jedoch eine viel bessere Option, wusste nicht, dass verfügbar war, danke. – user148813

1

ungeschickt Weg:

len=$(cat FILE | wc -l) 
sortable_len=$((len-3)) 

head -3 FILE > OUT 
tail -$sortable_len FILE | sort >> OUT 

Ich bin sicher, dass jemand ein eleganten 1-Liner in Kürze veröffentlichen.

0

Mit awk:

awk '{ if (NR > 2) { print $0 } }' file.txt | sort 

NR ist ein Einbau-awk Variable und enthält die aktuelle Datensatz/Zeilennummer. Es beginnt bei 1.

+1

Leider ist dies keine Lösung für die ursprüngliche Frage, da es die ersten beiden Zeilen komplett überspringt. – arielf

0

Sortieren Sie die Zeilen ohne den Header (2 Zeilen), nur für die Ansicht.

cat file.txt | awk '{if (NR < 3) print $0 > "/dev/stderr"; else print $0}' | sort 

Die Zeilen ohne die (2 Zeilen) Kopfzeilen sortieren und die Ausgabe an eine andere Datei senden.

Methode 1:

cat file.txt | awk '{if (NR < 3) print $0 > "/dev/stderr"; else print $0}' 2> file_sorted.txt | sort >> file_sorted.txt 

Methode # 2:

Verwandte Themen