Сравните два файла и получите совпадающие строки на основе двух столбцов

>выполняет open()в режиме O_WRONLY|O_TRUNK, а >>выполняет open()в режиме O_WRONLY|O_APPEND, но для именованного канала это не имеет значения.

3 различных случая для рассмотрения:

  1. ни один процесс еще не открыл файл fifo для чтения :тогда open()(, который выполняется оболочкой еще до выполнения команды, )будет блокироваться до тех пор, пока какой-либо процесс не откроет файл для чтения.
  2. какой-то процесс уже открыл файл fifo для чтения, но пока нет для записи :тогда наш open()завершится успешно и создаст экземпляр канала. Затем команда будет запущена сразу и сможет записывать в канал, где данные будут накапливаться до тех пор, пока канал не заполнится или какой-либо процесс не прочитает содержимое на другом конце.
  3. конвейер уже создан (, так как файл fifo уже открыт как для чтения, так и для записи ). Затем open()вернет fd в тот же канал (, а не создаст новый экземпляр ). Это означает, что запись, которую делает наша команда, будет чередоваться с записью других команд в канал. Записи гарантированно будут атомарными только в том случае, если они меньшеPIPE_BUF(4 КБ в Linux ).Это ничем не отличается от обычных труб, созданныхpipe()

Режим открытия, который имеет значение, это O _RDWR (чтение+запись ), который в оболочках достигается с помощью оператора <>(1<>для перенаправления stdout, так как в противном случае он открывается на fd 0 (stdin )), который во многих системах никогда не блокирует и не создает экземпляр канала, если он еще не создан.

1
17.09.2020, 00:21
1 ответ
$ awk -F '|' 'NR==FNR{a[$1]; next} ($1 in a) || ($2 in a)' file1.txt file2.txt
A1234|B1465
G1241|L1212
2
18.03.2021, 23:04

Теги

Похожие вопросы