сбой команды wait

Альтернатива Python

$ cat file | python -c "import sys
for line in sys.stdin: l=line.rstrip('\r\n').split('\t'); print('\t'.join(l[:9]) + ''.join(l[9:]))
"

Альтернатива sed

s/(([^\t]*\t){8})/\1\n/
h
s/[^\n]*\n//
s/\t//g
G
s/([^\n]*)\n([^\n]*)\n.*/\2\1/

Пример использования:

$ sed -r "s/(([^\t]*\t){8})/\1\n/;h;s/[^\n]*\n//;s/\t//g;G;s/([^\n]*)\n([^\n]*)\n.*/\2\1/" file

Пояснение:

Предположим, что файл равен

a   b   c   d   e   f   g   h   i   j   k   l

Разделителем в файле является табуляция.

  1. sed читает текущую строку.

    • пространство шаблонов a b c d e f g h i j k l
  2. s / (([^ \ t] * \ t) {8}) / \ 1 \ n / разбивает строку на две части.

    • пространство шаблонов a b c d e f g h \ ni j k l
  3. h сохраняет пространство шаблонов в пространстве хранения.

    • пространство шаблонов abcdefgh \ ni jkl
    • пространство хранения abcdefgh \ ni jkl
  4. s / [^ \ n] * \ n // удаляет первую часть в шаблоне Космос.

    • пространство шаблонов i j k l
    • удерживаемое пространство a b c d e f g h \ ni j k l
  5. s / \ t // g удаляет табуляции в пространстве шаблонов.

    • пространство шаблонов ijkl
    • пространство хранения a b c d e f g h \ ni j k l
  6. G добавляет \ n и удерживает пространство к пространству шаблонов.

    • пространство шаблонов ijkl \ na bcdefgh \ ni jkl
    • пространство для хранения abcdefgh \ ni jkl
  7. s / ([^ \ n] *) \ n ([^ \ n] *) \ n. * / \ 2 \ 1 / разделяет пространство шаблонов и заменяет его второй и первой частями без \ n .

    • пространство шаблонов a b c d e f g h ijkl
    • удерживаемое пространство a b c d e f g h \ ni j k l
  8. sed печатает пространство шаблонов.

Можно изменить код и удалить вкладки в средних столбцах:

s/(([^\t]*\t){3})(([^\t]*\t){4})(.*)/\1\n\3\n\5/
h
s/[^\n]*\n([^\n]*)\n.*/\1/
s/\t//g
G
s/([^\n]*)\n([^\n]*)\n([^\n]*)\n(.*)/\2\1\4/
3
05.11.2016, 13:17
1 ответ

До версии 5.0.8, zsh не мог ждать уже мертвых заданий. Это было изменено в версии 5.0.8 в 2014 году. См. изменение там.

Здесь вы можете просто перенаправить stderr в /dev/null, чтобы игнорировать проблему:

wait $pid 2> /dev/null

Обратите внимание, что в:

{ tee $tmpdir/orig | arbitrary_pipeline > $tmpdir/alt; } &

качестве оптимизации, zsh не будет форкать дополнительный процесс для arbitrary_pipeline, он будет выполнять его в том же процессе, что и тот, который запускает подшелл, запущенный в фоне.

paste не завершится до того, как увидит EOF на своем stdin, его stdin - это труба, на другом конце которой пишет $pid (и его дети, если таковые имеются). Таким образом, он не увидит eof, пока $pid (и его дети) не закроет все свои файловые дескрипторы (обычно только stdout) на пишущем конце трубы. Если только $pid явно не закроет свой stdout (что бывает очень редко), это произойдет только при выходе.

Это означает, что paste в большинстве случаев не завершится до $pid, но на всякий случай все же стоит выполнить wait.

Обратите внимание, что здесь можно использовать coproc, чтобы избежать временных fifos:

coproc arbitrary_pipeline
cat >&p | paste - /dev/fd/3 3<&p &
coproc : close
wait

(обратите внимание, что wait также ожидает coprocs).

3
27.01.2020, 21:21

Теги

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