Удаление строк из файла с помощью SED или AWK

Я видел много вариаций, очень смущенный тем, как решить эти 3 проблемы.

  • удаление всех строк, кроме первого из файла
  • удаление строки из файла с номером строки
  • удаление строк из файла с диапазоном номеров строк

Ответы

Ответ 1

Использование sed:

Удалить 1-ю строку:

sed '1d' file-name

Удалить 10-ю строку:

sed '10d' file-name

Удалить строку № 5 до 10

sed '5,10d' file-name

Все вышеописанные команды будут записывать вывод на stdout, чтобы вы могли перенаправить на другой файл, если хотите, или используйте флаг -i sed для встроенного редактирования файла.

Ответ 2

С 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

Чтобы сохранить несколько символов, {print} можно заменить только с помощью 1

Чтобы перезаписать исходный файл, вам нужно сделать что-то вроде этого

awk '...' file > tmpfile && mv tmpfile file

Ответ 3

вы можете просто использовать bash, если ваша система имеет его. Основная идея заключается в том, чтобы установить счетчик и увеличивать этот счет во время итерации файла.

1) удаление всех строк, кроме первого из файла

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

2) удаление строки из файла с номером строки

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) удаление строк из файла с диапазоном номеров строк, например, от 10 до 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