2 Stimmen

Datei ab einer bestimmten Zeile sortieren

Ich möchte eine Datei sortieren können, aber nur bis zu einer bestimmten Zeile und darunter. Vom Handbuch her ist sort nicht in der Lage, den Inhalt zu analysieren, also brauche ich ein zweites Programm, um dies zu tun. read? oder awk vielleicht? Hier ist die Datei, die ich gerne sortieren würde:

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 \

In diesem Fall möchte ich also mit der Sortierung in Zeile drei beginnen. Ich denke, ich werde eine Funktion verwenden müssen, um dies zu erreichen, etwa so

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

Ich bin ziemlich neu auf diesem Gebiet und das Skript sieht so aus, als ob es etwas vermissen würde. Außerdem bin ich nicht sicher, wie man bei einer bestimmten Zeilennummer beginnt.

Irgendwelche Ideen?

3voto

retracile Punkte 11600

So etwas wie das hier?

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

Möglicherweise müssen Sie die letzte Zeile der Eingabe korrigieren... es fehlt wahrscheinlich das abschließende \ für die Zeilenfortsetzung, so dass Sie eine kaputte 'backup-sorted.sh' haben könnten, wenn Sie nur das obige tun.

Vielleicht möchten Sie die Option --files-from (oder -T) von tar verwenden und die sortierte Liste der Dateien in einer Datendatei statt im Skript selbst aufbewahren.

2voto

Steve B. Punkte 52372

Unbeholfene Weise:

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

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

Ich bin sicher, jemand wird in Kürze einen eleganten Einzeiler veröffentlichen.

2voto

Vigneswaran R Punkte 21

Sortieren Sie die Zeilen ohne die (2-zeilige) Überschrift, nur zur Ansicht.

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

Sortieren Sie die Zeilen ohne die (2-zeiligen) Kopfzeilen und senden Sie die Ausgabe in eine andere Datei.

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:

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

1voto

sffortytwo Punkte 11

Sie könnten dies versuchen:

(read line; echo "$line"; sort) < file.txt

Es nimmt eine Zeile und gibt sie wieder, dann sortiert es den Rest. Das können Sie auch:

file.txt | (read line; echo "$line"; sort)

Bei zwei Zeilen wiederholen Sie einfach das Lesen und Echo:

(read line; echo "$line"; read line; echo "$line"; sort) < file.txt

0voto

Al. Punkte 2872

Verwendung von awk :

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

NR ist eine eingebaute awk und enthält die aktuelle Satz-/Zeilennummer. Sie beginnt bei 1.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X