Объединение двух файлов на основе общего столбца; добавьте 0 для вариантов, отсутствующих в файле 2, и сохраните исходное значение для тех, которые присутствуют

Вопрос немного озадачивает меня, не в последнюю очередь из-за канала (на tee), который вы, очевидно, хотите использовать. Чтобы поддерживать эту функциональность, вы можете использовать следующий скрипт:

#!/bin/ksh
tee output.file < <( java DemoJavaProgram ) &

Вот именно. Сценарий завершится, java-программа продолжит работу в фоновом режиме, а данные, выводимые java-программой на стандартный вывод, будут скопированы как на стандартный вывод, так и на output.file.

Я отмечаю, что простой запуск ps -aux | grep scriptName.kshможет ввести вас в заблуждение, полагая, что сценарий все еще выполняется, поскольку подстановка процесса <(...), скорее всего, выполняется в/из процесса подоболочки, который носит имя исходного сценария, но на самом деле ребенок tee. Родительский сценарий, т. е. вышеприведенный скрипт, будет мертв, что должно быть очевидно из значения PPID (, т. е. родительского PID ), которое вы можете проверить, например, ps -o pid,ppid,tty,comm -H.

0
05.03.2021, 17:19
1 ответ
awk 'NR==FNR{ snp[$3]=$NF; next }
{ $6=($3 in snp)?(FNR==1?"AN1":snp[$3]):"0" }1' file2 file1

Вещи вawk:

NR:Общее количество входных записей, просмотренных на данный момент.
FNR:Номер входной записи в текущем входном файле и сбрасывается до 1 для следующего входного файла.

Таким образом, условие NR==FNRвсегда будет истинным только для первого входного файла, и следующий блок NR==FNR {... }будет выполняться, когда оно истинно, и мы сохраняем значение последнего столбца $NFв массив awk snpсо столбцом $3в качестве ключей.

Оператор

nextзаставляет awk пропустить выполнение остальной части кода и начать заново, и если NF==FNRпо-прежнему верно, он будет повторять обработку этого блока до тех пор, пока не будут прочитаны все записи/строки первого входного файла.

затем в следующем блоке мы добавляем/обновляем значение столбца $6с указанными ниже условиями:

  • если столбец #3 в файле 1 был установлен в массиве snpиз файла 2, выполните :
    • если это первая строка, установите для нее значениеAN1
    • если не первая строка, установите ее значение равным значению, считанному из массива snp[$3].
  • иначе установите0.

awk idom1используется для печати результата в конце концов.

1
18.03.2021, 22:27

Теги

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