powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Unix-системы [игнор отключен] [закрыт для гостей] / файл без последних строк
25 сообщений из 28, страница 1 из 2
файл без последних строк
    #36535873
Wireless
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужно вывести файл без последних строк. Например двух.

Сейчас делаею вот так (ksh):
авторhead -$((`wc -l file.name | awk '{print $1}'` -2)) file.name > new.file

Требуется отказаться от команды wc, т.к. файл достаточно большой... огромный.

Есть ли какая-то другая хитрая tail/head каоманда, чтобы число строк выводимых понимала относительно общего числа строк в файле... ?
...
Рейтинг: 0 / 0
файл без последних строк
    #36535993
Мутабор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WirelessНужно вывести файл без последних строк. Например двух.

Сейчас делаею вот так (ksh):
авторhead -$((`wc -l file.name | awk '{print $1}'` -2)) file.name > new.file

Требуется отказаться от команды wc, т.к. файл достаточно большой... огромный.

Есть ли какая-то другая хитрая tail/head каоманда, чтобы число строк выводимых понимала относительно общего числа строк в файле... ?

Что бы посчитать количество строк нужно прочитать весь файл, так что хоть так, хоть иначе это назрузка IMXO
...
Рейтинг: 0 / 0
файл без последних строк
    #36536278
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно посчитать общее количество строк (по сути это подсчёт символов перевода строки) и применить head -n количество-2.
...
Рейтинг: 0 / 0
файл без последних строк
    #36536370
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WirelessЕсть ли какая-то другая хитрая tail/head каоманда, чтобы число строк выводимых понимала относительно общего числа строк в файле... ?смотря где...

$ head --version
head (GNU coreutils) 7.2

$ head --help
Использование: head [КЛЮЧ]... [ФАЙЛ]...
Печатает первые 10 строк каждого ФАЙЛА на стандартный вывод.
Если задано несколько ФАЙЛОВ, сначала печатает заголовок с именем файла.
Если ФАЙЛ не задан или задан как -, читает стандартный ввод.

Аргументы, обязательные для длинных ключей, обязательны и для коротких.
-c, --bytes=[-]N напечатать первые N байт каждого файла;
если перед N стоит `-', напечатать все, кроме N
последних байт каждого файла
-n, --lines=[-]N напечатать первые N строк каждого файла, а не 10;
если перед N стоит `-', напечатать все, кроме N
последних строк каждого файла

$ head -n -2
1
2
3
4
5^D
1
2
3
...
Рейтинг: 0 / 0
файл без последних строк
    #36537903
Wireless
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonМожно посчитать общее количество строк (по сути это подсчёт символов перевода строки) и применить head -n количество-2.
Я так и сделал в моем первом посте :)

Вы внимательно читали? Я как раз хотел сделать, чтобы явно (т.е. второй раз) файл не читать...
...
Рейтинг: 0 / 0
файл без последних строк
    #36537910
Wireless
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЁшWirelessЕсть ли какая-то другая хитрая tail/head каоманда, чтобы число строк выводимых понимала относительно общего числа строк в файле... ?смотря где...

$ head --version
head (GNU coreutils) 7.2

$ head --help
Использование: head [КЛЮЧ]... [ФАЙЛ]...
Печатает первые 10 строк каждого ФАЙЛА на стандартный вывод.
Если задано несколько ФАЙЛОВ, сначала печатает заголовок с именем файла.
Если ФАЙЛ не задан или задан как -, читает стандартный ввод.


автор$ head --version
head: 0652-036 Specify a positive decimal number.
Usage: head [-Count | -n Number | -c Number] [File...]

$ head --help
head: 0652-036 Specify a positive decimal number.
Usage: head [-Count | -n Number | -c Number] [File...]

$ uname
AIX

В общем, в AIXe другой grep. Ладно, всем спасибо. Придется wc делать :)
...
Рейтинг: 0 / 0
файл без последних строк
    #36537947
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WirelessmaytonМожно посчитать общее количество строк (по сути это подсчёт символов перевода строки) и применить head -n количество-2.
Я так и сделал в моем первом посте :)

Вы внимательно читали? Я как раз хотел сделать, чтобы явно (т.е. второй раз) файл не читать...
Прошу прощения. Я просто с awk не знаком.
...
Рейтинг: 0 / 0
файл без последних строк
    #36539179
fandr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Wireless
Wireless
$ uname
AIX


В общем, в AIXe другой grep. Ладно, всем спасибо. Придется wc делать :)

дык сразу надо говорить какой у тебя # uname ;)

скорее наоборот в AIX "стандартные" утилиты - GNU-шные расширенные...
как-то с ходу непонятно как это сделать в аиксе

как вариант - поставить gnu-шные :)


эти две последние строки как-то отличаются?
может таки регулярными выражениями можно откусить ( grep )
...
Рейтинг: 0 / 0
файл без последних строк
    #36540743
--null--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на самом деле задачу можно было бы решить всего одним проходом тем же awk-ом, делая getline и буферизируя строки при чтении в массив, распечатывая эти массивы и анализируя их содержимое (типа столько-то строк осталось до EOF - выводим только часть массива и закрываемся); возможно, на очень больших файлах это могло бы дать выигрыш.
...
Рейтинг: 0 / 0
файл без последних строк
    #36544443
fandr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--null--на самом деле задачу можно было бы решить всего одним проходом тем же awk-ом, делая getline и буферизируя строки при чтении в массив, распечатывая эти массивы и анализируя их содержимое (типа столько-то строк осталось до EOF - выводим только часть массива и закрываемся); возможно, на очень больших файлах это могло бы дать выигрыш.

хорошая идея 8)

для реализации потребуется буфер для хранения трех строк (кол-во "последних" строк + 1),
и все действительно можно сделать в один проход...
...
Рейтинг: 0 / 0
файл без последних строк
    #36546307
--null--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кстати, если уж вспомнить о sed - он замечательно решает такие задачи!

удалить последнюю строку
sed -ne '$q;p'

удалить последние две строки
sed -e 'N;$!P;$!D;$d'

удалить последние 10 строк
sed -e :a -e '$d;N;2,10ba' -e 'P;D'
...
Рейтинг: 0 / 0
файл без последних строк
    #36546315
skelet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--null--на самом деле задачу можно было бы решить всего одним проходом тем же awk-ом, делая getline и буферизируя строки при чтении в массив, распечатывая эти массивы и анализируя их содержимое (типа столько-то строк осталось до EOF - выводим только часть массива и закрываемся); возможно, на очень больших файлах это могло бы дать выигрыш.

чёта мне думается, что уж тогда проще тупо на плюсах а проход по файлу, действительно, должен быть один.

wc - вариант для нубов
...
Рейтинг: 0 / 0
файл без последних строк
    #36546348
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В один проход можно. С буферизацией. Создаём кольцевой буфер строк по количеству отсекаемых и в процессе чтения наполняем. Вытесняющиеся строки выводим в STDOUT. Когда файл прочитан в буфере остались ненужные строки которые выводить не надо.

Насчёт sed-а нужно проверить, не прогружает-ли он весь документ в оперативу. Хорошим краш-тестом будет чтение текстовика порядка > 4Gb.
...
Рейтинг: 0 / 0
файл без последних строк
    #36546359
--null--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sed - потоковый редактор и весь документ не должен загружать.
...
Рейтинг: 0 / 0
файл без последних строк
    #36546622
skelet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--null--sed - потоковый редактор и весь документ не должен загружать.
а если там нет переноса строк?
...
Рейтинг: 0 / 0
файл без последних строк
    #36546725
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skelet--null--sed - потоковый редактор и весь документ не должен загружать.
а если там нет переноса строк?
Тогда, думаю sed ё..нется с ошибкой memory alloc error.

В дополнение к своей реализации я придумал еще одну. Если нужно очень быстро найти offset первой "отсекаемой" строки то нужно использовать random access к файлу, прыгнуть SEEK-ом в самый конец и двигаясь в обратную сторону подсчитывать переводы строк. Естественно работать надо будет в бинарном режиме т.к. текстовые средства продвигают SEEK вперёд а нам это не нужно.
...
Рейтинг: 0 / 0
файл без последних строк
    #36546754
--null--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skelet--null--sed - потоковый редактор и весь документ не должен загружать.
а если там нет переноса строк?

если там нет переноса строк - то любой строковый сканер будет пытаться его целиком загружать - хоть sed, хоть awk, хоть perl, хоть что. Если специально прогу не написать с проверкой длины строки.
Да и в контексте данной задачи в этом файле -всего одна строка
...
Рейтинг: 0 / 0
файл без последних строк
    #36546771
Фотография Karbafos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
perl на то и perl, чтобы не только целиком в память засасывать.
кто мешает с конца блоками читать и проверять на \n
...
Рейтинг: 0 / 0
файл без последних строк
    #36546827
--null--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
имеются в виду стандартные сканеры типа getline, перловского <> или авковского строчного ввода и т.п. Понятно, что произвольно можно прогу написать как угодно.
...
Рейтинг: 0 / 0
файл без последних строк
    #36546848
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--null--имеются в виду стандартные сканеры типа getline, перловского <> или авковского строчного ввода и т.п. Понятно, что произвольно можно прогу написать как угодно.
Автор писал
Wireless Требуется отказаться от команды wc, т.к. файл достаточно большой... огромный.

Есть ли какая-то другая хитрая tail/head каоманда, чтобы число строк выводимых понимала относительно общего числа строк в файле... ?
Очевидно у него имеются проблемы с производительностью или с памятью при работе с "огромным" файлом. Рискну предположить что все sed-ы и awk-и проектировались под "разумный" объем текстового файла. И использование их с много-гигабайтными лог-* или еще бог весть какими файлами является антипаттерном и молчаливым криком о том что в тех-задании есть какой-то баг и так делать вообще нельзя. Надо смотреть в сам первоисточних этих тяжеловесных файлов и думать откуда они и зачем.

С уважением.
...
Рейтинг: 0 / 0
файл без последних строк
    #36546932
Фотография Karbafos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--null--имеются в виду стандартные сканеры типа getline, перловского <> или авковского строчного ввода и т.п. Понятно, что произвольно можно прогу написать как угодно.

Это понятно. Но все-таки "огромные" объемы не для стандартных сканеров, если они все в память засасывают.
А написать простейший свой скрипт займет гораздо меньше времени, чем обсуждение)
...
Рейтинг: 0 / 0
файл без последних строк
    #36546981
skelet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--null--skelet--null--sed - потоковый редактор и весь документ не должен загружать.
а если там нет переноса строк?

если там нет переноса строк - то любой строковый сканер будет пытаться его целиком загружать - хоть sed, хоть awk, хоть perl, хоть что. Если специально прогу не написать с проверкой длины строки.
Да и в контексте данной задачи в этом файле -всего одна строка

я про что и шпрехаю - что-бы корректно решить задачу надо писать на С++/С и не тупить
...
Рейтинг: 0 / 0
файл без последних строк
    #36546985
skelet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тем паче писать-то особо и нечего...
как тут уже правильно заметили - читаем с конца, скажем, по 1024 байта и ищем /n , потом когда позиция найдена делаем что угодно, хоть копируем, хоть так на месте обрабатываем (ставлю 99 против 1-го, что автору нафиг не впился скопированный файл без этих последних строчек)
...
Рейтинг: 0 / 0
файл без последних строк
    #36568689
Gradient
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не знаю, как на баше, а на питоне по-любому проще, чем на cpp.

Ну, например, навскидку "в лоб":
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
#!/usr/bin/python

import sys

def Shift(s, s1, s2):
        if s1 is None:
                return s, None

        if s2 is None:
                return s, s1

        print s2
        return s, s1

s1 = None
s2 = None

for s in open(sys.argv[ 1 ], "r"):
        s1, s2 = Shift(s[:- 1 ], s1, s2)

вызывать как-нибудь так: python <файл с вышеприведённым скриптом> <текстовый файл для обработки>

Если файл не указан или его не удастся открыть на чтение - получите исключение, только и всего.
...
Рейтинг: 0 / 0
файл без последних строк
    #36568712
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gradient,

а ты тестировал свой чудо-скрипт на много-гигабайтных файлах?

P.S. Питон не знаю.
...
Рейтинг: 0 / 0
25 сообщений из 28, страница 1 из 2
Форумы / Unix-системы [игнор отключен] [закрыт для гостей] / файл без последних строк
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]