У меня есть файл с 200 строками.
Мне нужно извлечь строки с 10 по 100 и поместить их в новый файл.
Как это сделать в Unix/Linux?
Какие команды вы могли бы использовать?
решение1
Использоватьсед:
sed -n -e '10,100p' input.txt > output.txt
sed -n
означаетнепечатать каждую строку по умолчанию. -e
означает выполнить следующий аргумент как скрипт sed. 10,100p
это скрипт sed, который означает, начиная со строки 10, до строки 100 (включительно), печатать ( p
) эту строку. Затем вывод сохраняется в output.txt
.
Если ваш файл длиннее, чем предлагается, эта версия (предложенная в комментариях) будет быстрее:
sed -e '1,9d;100q'
Это значитудалитьстроки 1-9,покидатьпосле строки 100 и вывести остальное. Для 200 строк это не будет иметь значения, но для 200 000 строк первая версия все равно будет просматривать каждую строку, даже если она никогда не будет их печатать. Я предпочитаю первую версию в целом за ее явность, но с длинным файлом это будет намного быстрее — вы лучше знаете свои данные.
В качестве альтернативы вы можете использовать head
и tail
в комбинации:
tail -n +10 input.txt | head -n 91 > output.txt
На этот раз tail -n +10
печатает весь файл, начиная со строки 10, и head -n 91
печатает первые 91 строку из него (до строки 100 исходного файла включительно). Перенаправление выполняется output.txt
таким же образом.
решение2
Это должно подойти
tail -n +10 file.txt | head -n 91 > newfile.txt
решение3
Если бы вы делали это в vim
, это было бы довольно просто. Предположим, что ваш файл называется src
, а файл, в который вы хотите переместить строки, — dest
. Если dest
его еще нет, вы должны создать его:
touch dest
Затем откройте оба src
и dest
в vim
( -p
флаг открывает аргументы во вкладках):
vim -p src dest
Перейти к десятой строке; выделить все с 10-й по 100-ю строку; скопировать; переключиться на вкладку, содержащую dest
; вставить.
10ggv101ygtp
Примечание: 101
выбирает до начала 101-й строки (захватывает \n
в конце строки 100).
Это, очевидно, немного более сложный процесс, чем использование инструмента командной строки, но имеет преимущество в том, что дает вам визуальный выбор (чтобы вы могли быть уверены, что получаете все, что хотите). Тем не менее, это также кажется хорошим вариантом использования для awk
:
awk 'NR==10, NR==100' src > dest
Переменная NR
позволяет вам сопоставлять шаблон с количеством строк. Таким образом, указанная выше команда извлекает строки 10–100 из , src
а затем ваша оболочка перенаправляет вывод в dest
.
решение4
Это можно сделать разными способами.
Решение awk
:
$ awk 'NR<10{next};1;NR>100{exit}' file > new_file
Решение perl
:
$ perl -nle '
print if $. > 9 and $. < 101;
exit if $. > 100;
' file > new_file