Сравните три файла: строки присутствуют во всех из них, используя сравнение столбцов

Вот что происходит, когда вы запускаете поток stdout и не подавляете stderr.

Поскольку sortдолжен иметь весь входной буфер, прежде чем он сможет выполнять свою работу, (очевидно, )он фактически не начинает передавать вывод в headдо того, как findзакончит поиск.

Однако, поскольку вы оставили stderr неподавленным, duсообщает об ошибках файлов, которые перестали существовать между временем, когда findувидел их, и duбыл запущен, и эти сообщения об ошибках появляются в момент их возникновения (, потому что stderr не буферизуется ).

Если вы запустите команду find без конвейера сортировки и заголовка, вы увидите, что происходит.

1
20.10.2019, 02:30
1 ответ

Я уверен, что найдется какая-нибудь суперзвезда, которая придумает ошеломляющее одноразовое 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

2
27.01.2020, 23:30

Теги

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