Удалить строки из файла с помощью SED или AWK - PullRequest
15 голосов
/ 19 апреля 2011

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

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

Ответы [ 3 ]

28 голосов
/ 19 апреля 2011

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

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

sed '1d' file-name

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

sed '10d' file-name

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

sed '5,10d' file-name

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

7 голосов
/ 19 апреля 2011

с 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
0 голосов
/ 22 апреля 2011

вы можете просто использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...