Сравнение столбцов в Linux

Как @Tagwint сказал в комментарии выше, вам также может понадобиться перенаправить stderr. Также вам не нужен echo $(...), вы можете просто использовать...:

someDockerCommand > file 2>&1

Предполагая, что вы используете bash, это можно упростить:

someDockerCommand &> file

Оба они перенаправляют как стандартный вывод, так и стандартную ошибку в указанный файл.

-1
20.06.2021, 23:32
2 ответа
awk '
  NR==FNR{ values[$2]; next }
  !($3 in values)
' File2 File1

Сначала считывается File2, а второе поле в массиве valuesсохраняется как индекс. Тест NR==FNRверен только для первого не -пустого входного файла. Сценарий продолжает запись next, чтобы пропустить следующую строку кода.

Затем считывается File1и проверяется, не присутствует ли 3-е поле в качестве индекса в массиве values. Если true, то печатает текущую запись (действие по умолчанию ).

2
28.07.2021, 11:23

Использование оболочки с подстановкой процессов (Сначала отсортируйте файлы отдельно, если у вас оболочка без<(...)):

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 )
1
28.07.2021, 11:23

Теги

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