READ будет блокировать, пока данные не будут доступен, и напишите заблокируют или выйдут, чтобы пройти полную трубу. Там мало параметров, таких как Pipe_buf , Pipe_size и O_NONBLOCK , которые играют ключевую роль в трубе.
Значение PIPE_BUF можно определить через «Ulimit -a». Это определено в пределах. Pipe_buf управляет гарантированным размером для атомных напитков . Это помогает в создании безопасных многопоточных приложений.
Pipe_size зависит от размера страницы. В 2,4 ядре он был эквивалентен размеру одной страницы (4 КБ). Однако версии после 2,6 сопоставлены на массив 16 страниц (64 КБ). Это определяется в файле Pipe_fs_i.h Как Pipe_Buffers (16). Последние версии ядра имеют FCNTL с F_SetPipe_SZ Включить увеличение размера страницы.
О O_NONBLOCK позволяет выполнять частичные и отложенные записи. Тем не менее, если O_NONBLOCK включен, но если количество байтов будет записано в трубе, больше, чем Pipe_buf, то запись не пройдет неудачу в трубу, если они заполнены, остальные на основе возвращаемого значения записи, он будет перемежен с данными из других процессов. Отказ
с последующим программой
:
awk '
BEGIN { FS = "([[:space:]]+|[|])" }
NR==FNR { id[$1] ; next }
/^>>/ && $2 in id { data = $2 ; f = 1 }
f && /^[0-9]/ { data = data " : " $10 " " $11 }
f && !NF { f = 0 ; print data }
' FileB FileA
Вы получите этот вывод:
AT5G46880.1 : 317 555
AT1G73360.1 : 230 457 : 544 566
: Я добавил второй идентификатор в Fileb, чтобы вы могли видеть, как будут обрабатываться несколько линий атрибута.
Как работает
программа программа :
Начало
- Полевой сепаратор определяется так, что мы можем позже Esily доступ к идентификатору от линий, начиная с «>>».
NR == FNR
- это шаблон, который верно при чтении первого файла; идентификаторы хранятся.
/ ^ >> / && $ 2 в ID
- мы подходим строки с идентификаторами и проверьте, было ли нашел идентификатор запоминается из первого файла. ID сохраняется для вывода и установлен флаг обработки.
F && / ^ [0-9] /
- Если флаг установлен, и мы сопоставляем строку, начинающуюся с цифры, мы добавляем соответствующие поля 10 и 11 на выходные данные (разделенные толстой кишкой).
F &&! NF
- Если флаг установлен, и обнаружена пустая строка, обработка выполняется для этого блока, и флаг очищен.
Проблема не была оболочкой или ЧБ или что-то экзотическое. Это был глупый псевдонимы на местном. Кто-то подумал, что это хорошая идея, чтобы создать псевдоним, который отображает локальный IP-адрес, и назвал его «локальным», поэтому линия
local cword words=()
не удалась не потому, что оболочка не может обрабатывать массивы. Он не удался, потому что псевдоним расширяется и ()
там не имеет смысла.
Попробуйте
grep -A4 -f <(sed 's/^/^>> /' fileB) fileA |
sed -r '/^>>/! s/(\S+\s+){8}((\S+\s+){3}).*/\2/
s/[][>.-]*\s*//'