Как @Tagwint сказал в комментарии выше, вам также может понадобиться перенаправить stderr. Также вам не нужен echo $(...)
, вы можете просто использовать...
:
someDockerCommand > file 2>&1
Предполагая, что вы используете bash, это можно упростить:
someDockerCommand &> file
Оба они перенаправляют как стандартный вывод, так и стандартную ошибку в указанный файл.
awk '
NR==FNR{ values[$2]; next }
!($3 in values)
' File2 File1
Сначала считывается File2
, а второе поле в массиве values
сохраняется как индекс. Тест NR==FNR
верен только для первого не -пустого входного файла. Сценарий продолжает запись next
, чтобы пропустить следующую строку кода.
Затем считывается File1
и проверяется, не присутствует ли 3-е поле в качестве индекса в массиве values
. Если true, то печатает текущую запись (действие по умолчанию ).
Использование оболочки с подстановкой процессов (Сначала отсортируйте файлы отдельно, если у вас оболочка без<(...)
):
join -v 1 -1 3 -2 2 -o 1.1,1.2,1.3 \
<( sort -b -k 3,3 File1 ) \
<( sort -b -k 2,2 File2 )
Это выполняет реляционную операцию JOIN между двумя отсортированными наборами данных, используя 3-й столбец первого набора(-1 3
)и 2-й столбец другого набора(-2 2
)в качестве полей соединения. Результатом join
будут 1-й, 2-й и 3-й столбцы из первого файла, как указано в опции -o
. Будут выведены только те строки из первого файла, которые нельзя соединить ни с одной строкой во втором файле(-v 1
).
Ввод в join
должен быть отсортирован с использованием sort -b
в столбце, который будет использоваться в качестве поля соединения, что и делают две подстановки процесса.
Результатом этого с использованием заданных данных будет
5/3/2021 Loan $5,146.11
Если в ваших файлах используются табуляции в качестве разделителей полей, вы можете использовать
join -t $'\t' -v 1 -1 3 -2 2 -o 1.1,1.2,1.3 \
<( sort -t $'\t' -b -k 3,3 File1 ) \
<( sort -t $'\t' -b -k 2,2 File2 )