wake-up-neo.net

Zeilen aus Datei mit SED oder AWK löschen

Ich habe viele Variationen gesehen, sehr verwirrt, wie man diese 3 Probleme löst.

  1. löschen aller Zeilen mit Ausnahme der ersten aus einer Datei
  2. löschen einer Zeile aus einer Datei mit einer Zeilennummer
  3. zeilen aus einer Datei mit einer Reihe von Zeilennummern löschen
15
bluetickk

Sed verwenden:

1. Zeile löschen:

sed '1d' file-name

10. Zeile löschen:

sed '10d' file-name

Löschen Sie die Zeilen 5 bis 10

sed '5,10d' file-name

Alle obigen sed-Befehle schreiben eine Ausgabe auf stdout, die Sie in eine andere Datei umleiten können, wenn Sie das -i-Flag von sed zum Inline-Bearbeiten der Datei verwenden möchten.

26
anubhava

Mit awk:

# delete line 1
awk 'NR == 1 {next} {print}' file

# delete line number stored in Shell variable $n
awk -v n=$n 'NR == n {next} {print}' file

# delete between lines $a and $b inclusive
awk -v m=$a -v n=$b 'm <= NR && NR <= n {next} {print}' file

Um ein paar Zeichen zu sparen, kann {print} einfach durch 1 ersetzt werden

Um die Originaldatei zu überschreiben, müssen Sie so etwas tun

awk '...' file > tmpfile && mv tmpfile file
7
glenn jackman

sie können nur bash verwenden, wenn Ihr System es hat. Die Grundidee dahinter ist, eine Anzahl festzulegen und diese Anzahl zu erhöhen, während die Datei iteriert wird.

1) Löschen aller Zeilen mit Ausnahme der ersten aus einer Datei

read -r line < file; echo "$line" > temp && mv temp file

2) Löschen einer Zeile aus einer Datei mit einer Zeilennummer

declare -i count=0
while read -r line
do
  ((count++))
  case "$count" in
    10) continue;;
    * ) echo "$line";;
  esac
done < file > temp && mv temp file

3) Löschen von Zeilen aus einer Datei mit einem Bereich von Zeilennummern, z. B. von 10 bis 20

declare -i count=0
while read -r line
do
  ((count++))
  if (( $c < 10 && $c > 20 ));then
    echo "$line";;
  fi
done < file > temp && mv temp file
0
bash-o-logist