|
|
|
файл без последних строк
|
|||
|---|---|---|---|
|
#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 |
|
||
|
файл без последних строк
|
|||
|---|---|---|---|
|
#18+
Gradient, а ты тестировал свой чудо-скрипт на много-гигабайтных файлах? P.S. Питон не знаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2010, 15:31 |
|
||
|
файл без последних строк
|
|||
|---|---|---|---|
|
#18+
На многогигабайтных не тестировал. Не очень советую: тут вывод идёт на stdout, то есть в консоль. Так что вывода даже мегабайтного ждать будете о-о-чень долго. Так что пока не представляю, зачем это нужно. Другое дело - после этого дела использовать ">outfile" тогда не сильно медленнее приведённого в старт.топике способа должно быть (увы, питон медленнее предложенного С - всё-таки интерпретируемый скрипт. Зато конструкции проще и грамотней.) Вообще должно работать нормально и не особо медленно: чтение из файла буферизированное, три строки прочитал - вывел, весь файл в память не засасывается. В общем - по-любому не самый плохой вариант. Imho. Но лучше - да, наверное, можно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2010, 17:53 |
|
||
|
файл без последних строк
|
|||
|---|---|---|---|
|
#18+
Karbafosperl на то и perl, чтобы не только целиком в память засасывать. кто мешает с конца блоками читать и проверять на \n +1. Отсчитать от конца файла ненужные строки, запомнить смещение, а потом sysread+syswrite блоками по X мегабайт от начала файла до смещения - на гигабайтных файлах с построчным чтением не сравнить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2010, 14:08 |
|
||
|
файл без последних строк
|
|||
|---|---|---|---|
|
#18+
Ну где-то так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2010, 15:49 |
|
||
|
|

start [/forum/topic.php?all=1&fid=25&tid=1484996]: |
0ms |
get settings: |
13ms |
get forum list: |
19ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
100ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
75ms |
get tp. blocked users: |
2ms |
| others: | 257ms |
| total: | 492ms |

| 0 / 0 |
