|
|
|
файл без последних строк
|
|||
|---|---|---|---|
|
#18+
Нужно вывести файл без последних строк. Например двух. Сейчас делаею вот так (ksh): авторhead -$((`wc -l file.name | awk '{print $1}'` -2)) file.name > new.file Требуется отказаться от команды wc, т.к. файл достаточно большой... огромный. Есть ли какая-то другая хитрая tail/head каоманда, чтобы число строк выводимых понимала относительно общего числа строк в файле... ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2010, 01:20 |
|
||
|
файл без последних строк
|
|||
|---|---|---|---|
|
#18+
WirelessНужно вывести файл без последних строк. Например двух. Сейчас делаею вот так (ksh): авторhead -$((`wc -l file.name | awk '{print $1}'` -2)) file.name > new.file Требуется отказаться от команды wc, т.к. файл достаточно большой... огромный. Есть ли какая-то другая хитрая tail/head каоманда, чтобы число строк выводимых понимала относительно общего числа строк в файле... ? Что бы посчитать количество строк нужно прочитать весь файл, так что хоть так, хоть иначе это назрузка IMXO ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2010, 08:11 |
|
||
|
файл без последних строк
|
|||
|---|---|---|---|
|
#18+
Можно посчитать общее количество строк (по сути это подсчёт символов перевода строки) и применить head -n количество-2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2010, 11:00 |
|
||
|
файл без последних строк
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2010, 11:28 |
|
||
|
файл без последних строк
|
|||
|---|---|---|---|
|
#18+
maytonМожно посчитать общее количество строк (по сути это подсчёт символов перевода строки) и применить head -n количество-2. Я так и сделал в моем первом посте :) Вы внимательно читали? Я как раз хотел сделать, чтобы явно (т.е. второй раз) файл не читать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2010, 18:09 |
|
||
|
файл без последних строк
|
|||
|---|---|---|---|
|
#18+
Ёш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 делать :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2010, 18:11 |
|
||
|
файл без последних строк
|
|||
|---|---|---|---|
|
#18+
WirelessmaytonМожно посчитать общее количество строк (по сути это подсчёт символов перевода строки) и применить head -n количество-2. Я так и сделал в моем первом посте :) Вы внимательно читали? Я как раз хотел сделать, чтобы явно (т.е. второй раз) файл не читать... Прошу прощения. Я просто с awk не знаком. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2010, 18:21 |
|
||
|
файл без последних строк
|
|||
|---|---|---|---|
|
#18+
Wireless Wireless $ uname AIX В общем, в AIXe другой grep. Ладно, всем спасибо. Придется wc делать :) дык сразу надо говорить какой у тебя # uname ;) скорее наоборот в AIX "стандартные" утилиты - GNU-шные расширенные... как-то с ходу непонятно как это сделать в аиксе как вариант - поставить gnu-шные :) эти две последние строки как-то отличаются? может таки регулярными выражениями можно откусить ( grep ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2010, 12:22 |
|
||
|
файл без последних строк
|
|||
|---|---|---|---|
|
#18+
на самом деле задачу можно было бы решить всего одним проходом тем же awk-ом, делая getline и буферизируя строки при чтении в массив, распечатывая эти массивы и анализируя их содержимое (типа столько-то строк осталось до EOF - выводим только часть массива и закрываемся); возможно, на очень больших файлах это могло бы дать выигрыш. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2010, 19:51 |
|
||
|
файл без последних строк
|
|||
|---|---|---|---|
|
#18+
--null--на самом деле задачу можно было бы решить всего одним проходом тем же awk-ом, делая getline и буферизируя строки при чтении в массив, распечатывая эти массивы и анализируя их содержимое (типа столько-то строк осталось до EOF - выводим только часть массива и закрываемся); возможно, на очень больших файлах это могло бы дать выигрыш. хорошая идея 8) для реализации потребуется буфер для хранения трех строк (кол-во "последних" строк + 1), и все действительно можно сделать в один проход... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2010, 13:05 |
|
||
|
файл без последних строк
|
|||
|---|---|---|---|
|
#18+
кстати, если уж вспомнить о sed - он замечательно решает такие задачи! удалить последнюю строку sed -ne '$q;p' удалить последние две строки sed -e 'N;$!P;$!D;$d' удалить последние 10 строк sed -e :a -e '$d;N;2,10ba' -e 'P;D' ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2010, 17:27 |
|
||
|
файл без последних строк
|
|||
|---|---|---|---|
|
#18+
--null--на самом деле задачу можно было бы решить всего одним проходом тем же awk-ом, делая getline и буферизируя строки при чтении в массив, распечатывая эти массивы и анализируя их содержимое (типа столько-то строк осталось до EOF - выводим только часть массива и закрываемся); возможно, на очень больших файлах это могло бы дать выигрыш. чёта мне думается, что уж тогда проще тупо на плюсах а проход по файлу, действительно, должен быть один. wc - вариант для нубов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2010, 17:41 |
|
||
|
файл без последних строк
|
|||
|---|---|---|---|
|
#18+
В один проход можно. С буферизацией. Создаём кольцевой буфер строк по количеству отсекаемых и в процессе чтения наполняем. Вытесняющиеся строки выводим в STDOUT. Когда файл прочитан в буфере остались ненужные строки которые выводить не надо. Насчёт sed-а нужно проверить, не прогружает-ли он весь документ в оперативу. Хорошим краш-тестом будет чтение текстовика порядка > 4Gb. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2010, 18:33 |
|
||
|
файл без последних строк
|
|||
|---|---|---|---|
|
#18+
sed - потоковый редактор и весь документ не должен загружать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2010, 18:50 |
|
||
|
файл без последних строк
|
|||
|---|---|---|---|
|
#18+
--null--sed - потоковый редактор и весь документ не должен загружать. а если там нет переноса строк? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2010, 07:53 |
|
||
|
файл без последних строк
|
|||
|---|---|---|---|
|
#18+
skelet--null--sed - потоковый редактор и весь документ не должен загружать. а если там нет переноса строк? Тогда, думаю sed ё..нется с ошибкой memory alloc error. В дополнение к своей реализации я придумал еще одну. Если нужно очень быстро найти offset первой "отсекаемой" строки то нужно использовать random access к файлу, прыгнуть SEEK-ом в самый конец и двигаясь в обратную сторону подсчитывать переводы строк. Естественно работать надо будет в бинарном режиме т.к. текстовые средства продвигают SEEK вперёд а нам это не нужно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2010, 12:37 |
|
||
|
файл без последних строк
|
|||
|---|---|---|---|
|
#18+
skelet--null--sed - потоковый редактор и весь документ не должен загружать. а если там нет переноса строк? если там нет переноса строк - то любой строковый сканер будет пытаться его целиком загружать - хоть sed, хоть awk, хоть perl, хоть что. Если специально прогу не написать с проверкой длины строки. Да и в контексте данной задачи в этом файле -всего одна строка ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2010, 13:18 |
|
||
|
файл без последних строк
|
|||
|---|---|---|---|
|
#18+
perl на то и perl, чтобы не только целиком в память засасывать. кто мешает с конца блоками читать и проверять на \n ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2010, 13:40 |
|
||
|
файл без последних строк
|
|||
|---|---|---|---|
|
#18+
имеются в виду стандартные сканеры типа getline, перловского <> или авковского строчного ввода и т.п. Понятно, что произвольно можно прогу написать как угодно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2010, 14:42 |
|
||
|
файл без последних строк
|
|||
|---|---|---|---|
|
#18+
--null--имеются в виду стандартные сканеры типа getline, перловского <> или авковского строчного ввода и т.п. Понятно, что произвольно можно прогу написать как угодно. Автор писал Wireless Требуется отказаться от команды wc, т.к. файл достаточно большой... огромный. Есть ли какая-то другая хитрая tail/head каоманда, чтобы число строк выводимых понимала относительно общего числа строк в файле... ? Очевидно у него имеются проблемы с производительностью или с памятью при работе с "огромным" файлом. Рискну предположить что все sed-ы и awk-и проектировались под "разумный" объем текстового файла. И использование их с много-гигабайтными лог-* или еще бог весть какими файлами является антипаттерном и молчаливым криком о том что в тех-задании есть какой-то баг и так делать вообще нельзя. Надо смотреть в сам первоисточних этих тяжеловесных файлов и думать откуда они и зачем. С уважением. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2010, 14:56 |
|
||
|
файл без последних строк
|
|||
|---|---|---|---|
|
#18+
--null--имеются в виду стандартные сканеры типа getline, перловского <> или авковского строчного ввода и т.п. Понятно, что произвольно можно прогу написать как угодно. Это понятно. Но все-таки "огромные" объемы не для стандартных сканеров, если они все в память засасывают. А написать простейший свой скрипт займет гораздо меньше времени, чем обсуждение) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2010, 17:01 |
|
||
|
файл без последних строк
|
|||
|---|---|---|---|
|
#18+
--null--skelet--null--sed - потоковый редактор и весь документ не должен загружать. а если там нет переноса строк? если там нет переноса строк - то любой строковый сканер будет пытаться его целиком загружать - хоть sed, хоть awk, хоть perl, хоть что. Если специально прогу не написать с проверкой длины строки. Да и в контексте данной задачи в этом файле -всего одна строка я про что и шпрехаю - что-бы корректно решить задачу надо писать на С++/С и не тупить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2010, 17:59 |
|
||
|
файл без последних строк
|
|||
|---|---|---|---|
|
#18+
тем паче писать-то особо и нечего... как тут уже правильно заметили - читаем с конца, скажем, по 1024 байта и ищем /n , потом когда позиция найдена делаем что угодно, хоть копируем, хоть так на месте обрабатываем (ставлю 99 против 1-го, что автору нафиг не впился скопированный файл без этих последних строчек) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2010, 18:03 |
|
||
|
файл без последних строк
|
|||
|---|---|---|---|
|
#18+
Не знаю, как на баше, а на питоне по-любому проще, чем на cpp. Ну, например, навскидку "в лоб": Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. вызывать как-нибудь так: python <файл с вышеприведённым скриптом> <текстовый файл для обработки> Если файл не указан или его не удастся открыть на чтение - получите исключение, только и всего. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2010, 15:26 |
|
||
|
|

start [/forum/topic.php?fid=25&msg=36536370&tid=1484996]: |
0ms |
get settings: |
9ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
92ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
68ms |
get tp. blocked users: |
2ms |
| others: | 247ms |
| total: | 460ms |

| 0 / 0 |
