Как перенести строки с 10 по 100 из файла из 200 строк в новый файл

Как перенести строки с 10 по 100 из файла из 200 строк в новый файл

У меня есть файл с 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

Связанный контент