Как сравнить два столбца файла и списка и вывести несоответствующий шаблон с помощью awk

Вы должны либо создать свой MOK и подписать с его помощью загрузчик , либо получить дополнительную пару прокладка+загрузчик (как в "загрузчик, подписанный с сертификатом, который прокладка была скомпилировано с")--см. также отличные книги Рода по теме(Работа с безопасной загрузкой , Управление безопасной загрузкой ), а также мой UEFI SecureBoot mini -HOWTO , если вы заинтересованы в том, чтобы помочь Arch получить их прокладку, подписанную UEFI CA (== MSFT ).

Получение дистрибутива Linux, который на самом деле прошел через эту боль для вас, может быть намного проще, хотя (Я знаю Fedora, SUSE, Ubuntu, ALT и ROSA на сегодняшний день, хотя их может быть больше ).

PS :точный (но бесполезный)ответ заключается в том, что ваша прокладка уже работает как задумано...

0
15.06.2021, 13:02
3 ответа
awk ' BEGIN{OFS="\t"}
NR==FNR{ for(i=1; i<=NF; i++) muts[$i]; next }
FNR>1  { len=split($2, tmp, ",");
         for(i=1; i<=len; i++) buf= buf (tmp[i] in muts?"":(buf==""?"":",") tmp[i])
       }
{ print $0, (FNR==1?"mutation_not":buf); buf="" }' FS=',' fileB FS='\t' fileA
3
28.07.2021, 11:24

Использованиеgawk:

awk 'BEGIN{OFS="\t"; }
NR==FNR{ar[$1]=$1;next}
FNR==1{$(NF+1) = "mutation_not"}
FNR>1{split($2,a,","); 
for(i in a) if (a[i] in ar) ; 
else ncol[$1] = (ncol[$1])? ncol[$1] "," a[i] : a[i]; 
$(NF+1) = ncol[$1]}1' 
RS="," B.txt  RS="\n" FS="\t" A.tsv

Предполагая, что все поля разделены запятой и состоят только из одной строки, разделитель записей(RS)устанавливается равным запятой для файла B.txt.

NR==FNR{ar[$1]=$1;nextсоздает массив ar, проиндексированный по первому полю первого файла.

FNR==1{$(NF+1) = "mutation_not"создает еще один столбец в имени заголовка.

FNR>1{split($2,a,",")разбивает второе поле A.tsvна массив a.

Следующая запись, отсутствующая в B.txt, сохраняется в массиве ncol. $(NF+1) = ncol[$1]создает еще один столбец с элементами массива ncol.

1
28.07.2021, 11:24

Мы сформируем sets2 из разделенных запятыми -элементов файла B.txt

Затем для каждой строки A.tsv мы преобразуем второе поле в множество и вычтем из него множество s2. Это дает нам мутации, присутствующие в A.tsv, которых нет в B.txt. Затем соединяем получившиеся элементы и печатаем вместе с исходной строкой.

python3 -c 'import sys
tsv,txt = sys.argv[1:]
fs,rs = "\t","\n"
ofs,dlm = fs,","

with open(txt) as fh, open(tsv) as f:
  s2 = set(*list(map(lambda x:x.rstrip(rs).split(dlm),fh.readlines())))

  for nr,ln in enumerate(f,1):
    l = ln.rstrip(rs)
    if nr == 1: print(l,"mutation_not",sep=ofs)
    else:
      F = l.split(ofs)
      if len(F) < 2: print(l)
      else: print(l,
  dlm.join({*F[1].split(dlm)}-s2),sep=ofs)

' A.tsv B.txt

Результат:

id  mutation    mutation_not
243 siti,toto,mumu  toto
254
267 lala,siti,sojo  sojo
289 lala    

На этот раз мы воспользуемся редактором Gnu sed для получения результатов:

sed -Ee '
  1{h;d;}
  2s/\tmutation$/&&_not/;t

  s/\t\S+$/&&,/;T;G
  s/\t/\n/2;ta

  :a
  s/\n([^,]+),(.*\n(.*,)?\1(,|$))/\n\2/;ta
  s/\n([^,\n]+),/\t\1\n/;ta

  s/\n.*//
' B.txt A.tsv

Идея состоит в том, что файл Btxt хранится в удержании (, предполагая, что это одна строка ), и каждая строка A.tsv дополняется содержимым B.txt, а мутации, обнаруженные в B, отмечены галочкой. текст. После просмотра всех мутаций строка печатается.

0
28.07.2021, 11:24

Теги

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