Удаление строк из файла с помощью 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