Вот что происходит, когда вы запускаете поток stdout и не подавляете stderr.
Поскольку sort
должен иметь весь входной буфер, прежде чем он сможет выполнять свою работу, (очевидно, )он фактически не начинает передавать вывод в head
до того, как find
закончит поиск.
Однако, поскольку вы оставили stderr неподавленным, du
сообщает об ошибках файлов, которые перестали существовать между временем, когда find
увидел их, и du
был запущен, и эти сообщения об ошибках появляются в момент их возникновения (, потому что stderr не буферизуется ).
Если вы запустите команду find без конвейера сортировки и заголовка, вы увидите, что происходит.
Я уверен, что найдется какая-нибудь суперзвезда, которая придумает ошеломляющее одноразовое awk
решение, но вот кувалда.
Предполагая, что все файлы правильно отсортированы по ключу в столбце 3 (, в противном случае вам нужно сначала отсортировать их с помощью sort -k 3 file
).
join -j 3 2d.tsv 3d.tsv | join -1 1 -2 3 - 4d.tsv > tmp
awk '{print $2, $3, $1}' tmp > 2d_new.tsv
awk '{print $4, $5, $1}' tmp > 3d new.tsv
awk '{print $6, $7, $1}' tmp > 4d_new.tsv
Последние 3 строки можно объединить
awk '{ print $2, $3, $1 > "2d_new.tsv"; print $4 $5, $1 > "3d_new.tsv"; print $6, $7, $1 > "4d_new.tsv" }' tmp
И если вы склоняетесь к тому, чтобы избежать файла tmp
, тогда просто |
от join
доawk