У меня довольно большой CSV-файл (75 МБ). Я просто пытаюсь составить график этого, поэтому мне действительно не нужны все данные.
Переписывание: я хотел бы удалить n строк, затем оставить одну строку, затем удалить n строк и так далее.
Так что если файл выглядел так:
Line 1
Line 2
Line 3
Line 4
Line 5
Line 6
и n = 2, тогда результат будет:
Line 3
Line 6
Кажется, что sed
может быть в состоянии сделать это, но я не смог понять, как. Команда bash была бы идеальной, но я открыт для любого решения.
Ответы:
NR
Переменная (количество записей) - это число записей, потому что поведение по умолчанию - новая строка дляRS
(разделитель записей). шаблон и действие необязательны в формате по умолчанию в awk'pattern {actions}'
. когда мы даем только часть шаблона, тогдаawk
записываются все поля$0
дляtrue
условий нашего шаблона .источник
awk 'NR == 1 || NR % 3 == 0'
awk 'NR == 1 || NR % 2 == 0' myfile.txt | wc -l
что в результате получается нечетное число, тогда как в исходном файле было четное количество строк. Ответ @kev работает лучше всего в моем тестовом случае.sed
также можно сделать это:man sed
объясняет~
как:источник
1p
печатает первую строку,0~3p
печатает каждую третью строку, начиная со строки 3 (1p
таким образом, требуется для печати строки 1). Но обратите внимание, что0~3
это не стандартное, а расширение GNU sed.sed -n '1p;0~10p' '.\in.txt' > out.txt
напечатать уменьшенный файл в выходной файл.Perl может сделать это тоже:
Эта программа напечатает первую строку своего ввода, а затем каждую третью строку.
Чтобы объяснить это немного,
<>
это оператор ввода строки, который перебирает строки ввода при использовании вwhile
цикле, подобном этому. Специальная переменная$.
содержит количество прочитанных строк и%
является оператором модуля.Этот код можно записать еще более компактно , как однострочник, используя
-n
и-e
переключатели:-e
Переключатель принимает фрагмент кода Perl для выполнения в качестве параметра командной строки, в то время как-n
переключатель неявно оборачивает код вwhile
цикле , как это показано выше.Редактировать: чтобы получить строки 1, 3, 6, 9, ... как в примере, а не строки 1, 4, 7, 10, ... как я впервые предположил, что вы хотели, замените
$. % 3 == 1
на$. == 1 or $. % 3 == 0
.источник
Если вы хотите сделать это с помощью Bash- скрипта, вы можете попробовать:
Сохраните его как «read_lines.sh» и не забудьте дать + x разрешений файлу bash.
источник
./read_lines.sh > new_file.txt
.Решение в чистом bash, которое не порождает процесс:
Первая строка пропускает 2 строки в начале файла, а затем
while
печатает следующую строку и пропускает 2 строки снова.Если ваш файл небольшой, это очень эффективный способ выполнить работу, так как он не запускает процесс. Когда ваш файл большой, его
sed
следует использовать, так как он более эффективен при обработке io, чемbash
.источник
Версия Python (оба Python 2 и Python 3):
замените параметры
[::3]
начала, конца и размера шага для большего контроля. Например,[10:36:5]
выдает строки 10,15, ..., 35.Обратите внимание, что, поскольку
readlines()
строки заканчиваются, выходные данные этого вызова могут заканчиваться пустой последней строкой, если исходная последняя строка не будет выведена на выбранный размер шага.Также возможна потоковая версия (здесь вывод только после законченного потока):
источник