файл без последних строк

Wireless
Дата: 23.03.2010 01:20:04
Нужно вывести файл без последних строк. Например двух.

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


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

Есть ли какая-то другая хитрая tail/head каоманда, чтобы число строк выводимых понимала относительно общего числа строк в файле... ?
Мутабор
Дата: 23.03.2010 08:11:15
Wireless
Нужно вывести файл без последних строк. Например двух.

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


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

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


Что бы посчитать количество строк нужно прочитать весь файл, так что хоть так, хоть иначе это назрузка IMXO
mayton
Дата: 23.03.2010 11:00:36
Можно посчитать общее количество строк (по сути это подсчёт символов перевода строки) и применить head -n количество-2.
Ёш
Дата: 23.03.2010 11:28:37
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
Wireless
Дата: 23.03.2010 18:09:14
mayton
Можно посчитать общее количество строк (по сути это подсчёт символов перевода строки) и применить head -n количество-2.

Я так и сделал в моем первом посте :)

Вы внимательно читали? Я как раз хотел сделать, чтобы явно (т.е. второй раз) файл не читать...
Wireless
Дата: 23.03.2010 18:11:27
Ёш
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 делать :)
mayton
Дата: 23.03.2010 18:21:55
Wireless
mayton
Можно посчитать общее количество строк (по сути это подсчёт символов перевода строки) и применить head -n количество-2.

Я так и сделал в моем первом посте :)

Вы внимательно читали? Я как раз хотел сделать, чтобы явно (т.е. второй раз) файл не читать...

Прошу прощения. Я просто с awk не знаком.
fandr
Дата: 24.03.2010 12:22:12
Wireless

Wireless

$ uname
AIX


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


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

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

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


эти две последние строки как-то отличаются?
может таки регулярными выражениями можно откусить (grep)
--null--
Дата: 24.03.2010 19:51:38
на самом деле задачу можно было бы решить всего одним проходом тем же awk-ом, делая getline и буферизируя строки при чтении в массив, распечатывая эти массивы и анализируя их содержимое (типа столько-то строк осталось до EOF - выводим только часть массива и закрываемся); возможно, на очень больших файлах это могло бы дать выигрыш.
fandr
Дата: 26.03.2010 13:05:09
--null--
на самом деле задачу можно было бы решить всего одним проходом тем же awk-ом, делая getline и буферизируя строки при чтении в массив, распечатывая эти массивы и анализируя их содержимое (типа столько-то строк осталось до EOF - выводим только часть массива и закрываемся); возможно, на очень больших файлах это могло бы дать выигрыш.


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

для реализации потребуется буфер для хранения трех строк (кол-во "последних" строк + 1),
и все действительно можно сделать в один проход...