У меня есть файл с именем, Element_query
содержащим результат запроса:
SQL> select count (*) from element;
[Output of the query which I want to keep in my file]
SQL> spool off;
Я хочу удалить 1-ю строку и последнюю строку с помощью команды оболочки.
Ответы:
Используя GNU
sed
:Как это работает :
-i
Возможность редактировать сам файл. Вы также можете удалить эту опцию и перенаправить вывод в новый файл или другую команду, если хотите.1d
удаляет первую строку (1
действовать только на первую строку,d
чтобы удалить ее)$d
удаляет последнюю строку ($
чтобы действовать только на последнюю строку,d
чтобы удалить ее)Идти дальше :
1,5d
удалили первые 5 строк.SQL>
выражения/^SQL> /d
/^$/d
statement1;statement2;satement3;...
) или указав их отдельно в командной строке (-e 'statement1' -e 'statement 2' ...
)источник
1,3d
удалит первые три строки), но это немного сложнее для конца. В зависимости от того, что вы хотите, вам может быть лучше использовать это:sed -i '/^SQL> /d' Element_query
удалить строки, которые начинаются сSQL>
того, где они находятся в файле.sed
однострочный - который будет работать для удаления произвольного количества строк в начале и в конце файла. Однако лучше, если входной файл является обычным файлом, а просто группировать один вход в дваhead
процесса - это Самый быстрый способ сделать это обычно.sed -i '1d' table-backup.sql
чтобы удалить первую строку текстового файла sqlголова; голова
С помощью вышеприведенного вы можете указать первое число строк для удаления заголовка выходных данных с первой
head
командой и количество строк для записиoutfile
со второй. Это также обычно делает это быстрее, чем,sed
особенно когда ввод велик, несмотря на то, что требуется два вызова. Гдеsed
определенно должны быть предпочтительными , хотя, в том случае, если<infile
это не обычный, lseekable файл - потому что это будет , как правило , не работают как положено в этом случае, ноsed
может обрабатывать все модификации выходных в одном, сценарном процессе.С GNU
head
вы также можете использовать-
отрицательную форму для[num]
второй команды. В этом случае следующая команда удалит первую и последнюю строки из ввода:ИЛИ с POSIX
sed
:Скажем, например, я читал ввод из 20 строк, и я хотел убрать первые 3 и последние 7. Если бы я решил сделать это w /
sed
, я бы сделал это с хвостовым буфером. Я бы сначала сложил три и семь для общего количества полос десять, а затем сделал бы:Это пример, который удаляет первые 3 и последние 7 строк из ввода. Идея состоит в том, что вы можете буферизовать столько строк, сколько хотите, чтобы вырезать их из хвоста ввода в пространстве шаблонов в стеке, но только
P
набирать первую из них для каждой извлеченной строки.1,10
sed
P
ничего не печатается, потому что для каждого из них он укладывает входные данные в шаблонное пространство построчно вb
цикле ранчо.sed
стеки 'ыd
выбраны - и поэтому первые 3 строки удаляются из вывода одним махом.sed
достигает$
последней строки ввода и пытается выдвинутьN
ext, он достигает EOF и полностью останавливает обработку. Но в то время пространство образца содержит все линии14,20
- ни одна из которых еще не былаP
набрана и никогда не была.sed
P
печатается только до первой\n
встречной линии в пространстве шаблона иD
выбирается одинаково перед началом нового цикла с тем, что осталось - или следующими 6 строками ввода. Седьмая строка снова добавляется в стек командойN
ext в новом цикле.И так, из
seq
выходных данных (то есть 20 последовательно пронумерованных строк) ,sed
только печатает:Это становится проблематичным, когда число строк, которые вы хотите вырезать из хвоста ввода, велико - потому что
sed
производительность прямо пропорциональна размеру пространства шаблонов. Тем не менее, во многих случаях это жизнеспособное решение - и POSIXsed
задает пространство шаблонов для обработки не менее 4 КБ перед перебором.источник
tail
также поддерживает расширенныйtail -n+<num>
синтаксис, означающий «начать со строки<num>
»Я не собираюсь отвечать, как удалить несколько строк. Я собираюсь атаковать проблему следующим образом:
grep -v '#SQL>' Element_query >outfile
Вместо подсчета строк он устраняет команды SQL, распознавая подсказки. Это решение затем может быть обобщено для других выходных файлов сеансов SQL с большим количеством команд, чем просто две.
источник
ed
является «стандартным текстовым редактором» и должен быть доступен в системах, в которых нет GNUsed
. Первоначально он был разработан как текстовый редактор, но он хорошо подходит для сценариев.1d
удаляет первую строку файла$d
(в кавычках, чтобы оболочка не считала его переменной) удаляет последнюю строку,w
записывает файл иq
завершает работуed
.printf
здесь используется для форматирования команд дляed
- за каждой должна следовать новая строка; Конечно, есть и другие способы сделать это.источник
Есть несколько способов удалить начальные и конечные строки из файла.
Вы можете использовать, так
awk
как он обрабатывает как сопоставление с образцом, так и подсчет строк,Вы можете использовать,
grep -v
чтобы исключить линии, которые вы не хотите по шаблону, и вы можете сопоставить несколько шаблонов, используя-E
опцию,Вы можете использовать
head
иtail
обрезать определенные количества строк,Вы можете использовать
vi/vim
и удалить первую и последнюю строку (и),Вы можете использовать Perl-скрипт, пропустить первую строку, сохранить каждую строку, напечатать, когда вы получите следующую строку,
источник
head
вам на самом деле не нужна труба, и, на самом деле, лучше вообще не использовать ее, если вам это сойдет с рук. Когда вы это делаетеhead | head
- хотя эти два процесса могут работать одновременно, они также оба избыточно обрабатывают практически все одни и те же данные. Если вы делаете вместо этого,{ head >dump; head >save; } <in
вы пропускаете только по смещению - первый читает 10 строк,>dump
а второй читает следующие 10 строк>save
.Вы были бы лучше обслужены, отсекая команды SQL. Вы можете сделать это двумя способами:
Если вы абсолютно уверены, что последовательность "
SQL>
" не встречается где-либо еще в выводе,Если вы не уверены,
Вторая версия медленнее, но более точна: она игнорирует строки, начинающиеся точно с «SQL>» и заканчивающиеся точкой с запятой, которые, по-видимому, описывают строки, которые вы хотите удалить.
Однако было бы лучше не помещать этот дополнительный вывод в файл для начала. У большинства систем SQL есть некоторый способ сделать это. Я не слишком знаком с Oracle, но, возможно, этот ответ может быть полезным.
источник
Вы можете выбрать строки между диапазонами
awk
(предполагается, что вы знаете, сколько строк):Или в Perl:
Если вы не знаете, сколько строк, вы можете рассчитать их на лету, используя
grep
(обратите внимание, что это не будет подсчитывать пустые строки, используйте такжеgrep -c '' file
для подсчета их):источник
Попробуйте это решение:
настройка
Вы можете легко адаптировать его для удаления n первых строк, изменяющих
+2
oftail
;или удалить последние n строк, изменяя
-1
изhead
.источник
Использование
awk
:< inputfile
: перенаправляет содержимоеinputfile
вawk
's'stdin
> outputfile
: Перенаправляет содержаниеawk
«sstdout
вoutputfile
NR>1
: выполняет следующие действия, только если номер обрабатываемой записи больше 1{print r}
: печатает содержимое переменнойr
{r=$0}
: назначает содержимое обрабатываемой записи переменнойr
Таким образом, при первом выполнении
awk
сценария первый блок действий не выполняется, а второй блок действий выполняется, и содержимое записи назначается переменнойr
; при втором выполнении выполняется первый блок действий иr
печатается содержимое переменной (поэтому печатается предыдущая запись); это приводит к печати каждой обработанной строки, кроме первой и последней.источник
r
.