CentOS 7 -Yum Не соответствует аргументу :обновление

Команда joinвыполняет работу по объединению совпадающих строк из нескольких файлов. Но у него есть некоторые требования к входным файлам, поэтому вам нужно будет создать несколько временных файлов с несколькими дополнительными полями.

awk '{printf $2" "$3" "$4" "$5"%"$1"%"; $1="";print $0 "%" NR }' < file1 | sort > 1.tmp
awk '{print $1" "$4" "$5" "$6"%"$2} $5 != $6 {print $1" "$4" "$6" "$5"%"$2}' < file2 | sort > 2.tmp

join -a 1 -t % -o 1.4 2.2 1.2 1.3  1.tmp 2.tmp | sort -t % -n | awk -F %  '!$2{$2=$3}{print $2" "$4}'

Шаг за шагом

Предварительная обработка первого файла:

awk '{printf $2" "$3" "$4" "$5"%"$1"%"; $1="";print $0 "%" NR }''

Пример вывода:

1 118630 C T%1:118630% 1 118630 C T 0.99 -0.033 0.055 5.5e-01 226311%4

Эти 4 поля, разделенные %, являются:

  • "ключ", который должен соответствовать (поля ввода 2 -5)
  • исходный первый столбец (необходим на случай отсутствия совпадений)
  • остаток исходной строки
  • исходный номер строки (, чтобы мы могли восстановить порядок файлов послеsort)

Этот вывод передается через sortво временный файл, поскольку joinтребует сортировки входных данных.

Для второго файла:

awk '{print $1" "$4" "$5" "$6"%"$2} $5 != $6 {print $1" "$4" "$6" "$5"%"$2}'

Пример вывода:

1 118630 C T%1:118630_C_T
1 118630 T C%1:118630_C_T

Поскольку вы указали, что поля 5 и 6 должны совпадать в любом случае, вторая строка печатается с их перестановкой (при условии, что они не идентичны ). Разделенные поля%-здесь:

  • "ключ" для сопоставления
  • столбец 2

Опять же, выходные данные передаются через sortв другой временный файл.

Затем следует основной этап «объединения»:

join -a 1 -t % -o 1.4 2.2 1.2 1.3  1.tmp 2.tmp

-a 1указывает joinсохранять строки из первого набора, если во втором нет совпадения. -t %устанавливает разделитель на %(, а не на пробел ). Аргумент -oсоздает следующие четыре поля вывода:

  • файл 1, столбец 4 :номер строки
  • файл 2, столбец 2 :замена изfile2(при отсутствии совпадений будет пустым)
  • файл 1, столбец 2 :исходный столбец 1 изfile1
  • файл 1, столбец 3 :остаток строки изfile1

Пример строки вывода:

4%1:118630_C_T%1:118630% 1 118630 C T 0.99 -0.033 0.055 5.5e-01 226311

Затем sortможно восстановить исходный порядок файлов (сортировка по цифрам, разделитель полей%)

sort -t % -n

Окончательный awkпроверяет, является ли поле «замена» пустым (, поскольку совпадение не найдено ), и если да, то вместо этого использует исходный столбец1. Он также отбрасывает номер строки и все эти %s.

awk -F % '!$2{$2=$3}{print $2" "$4}'

Конечная строка вывода:

1:118630_C_T  1 118630 C T 0.99 -0.033 0.055 5.5e-01 226311
0
17.09.2021, 12:33
0 ответов

Теги

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