Сопоставление с шаблоном и удаление всей строки

Вместо цветов я просто использую строку index_format , чтобы показать наличие вложений, например:

set index_format = "[% Z] [ %? X? A &?]% D% -20.20F% s% g "

%? X? A &? - это тернар, который говорит , если электронное письмо имеет ненулевое значение вложения , затем показывают символ "A", else показывают "". Вы действительно можете показать количество вложений, но меня обычно просто волнует, есть они или нет.

1
25.11.2018, 16:56
4 ответа

Вы можете использовать этот awk :

$ awk 'FNR==NR {a[$i]; next}; !($1 in a)' f2 f1
r002:21:10    21    YAAAATTTGC     *     =    nM:21
r0012:21:10   21    LLAAAATTTGC    *     +    XM:21

Пояснение

  • FNR == NR {a [$ i]; next} он читает первый файл и сохраняет его содержимое в массив a .
  • ! ($ 1 в a) при чтении второго файла проверяется, находится ли первое поле в массиве a . Если нет, печатает строку.
6
29.04.2021, 00:42

Вы также можете выполнить

$ grep -wvFf file2 file1
r002:21:10    21    YAAAATTTGC     *     =    nM:21
r0012:21:10   21    LLAAAATTTGC    *     +    XM:21

From man grep :

   -F, --fixed-strings
          Interpret PATTERN as a  list  of  fixed  strings,  separated  by
          newlines,  any  of  which is to be matched. 
   -f FILE, --file=FILE
          Obtain  patterns  from  FILE,  one  per  line.  
   -v, --invert-match
          Invert the sense of matching, to select non-matching lines. 
   -w, --word-regexp
          Select  only  those  lines  containing  matches  that form whole
          words.  The test is that the matching substring must  either  be
          at  the  beginning  of  the  line,  or  preceded  by  a non-word
          constituent character.

ПРИМЕЧАНИЕ : Это, однако, будет искать всю строку file1 полностью, а не только первый столбец.

2
29.04.2021, 00:42

Если порядок вывода не важен и ваша оболочка поддерживает подстановку процесса (bash поддерживает), вы можете использовать объединить в отсортированных файлах:

join -v 1 <(sort -k1,1 file1) <(sort -k1,1 file2) | column -t
r0012:21:10  21  LLAAAATTTGC  *  +  XM:21
r002:21:10   21  YAAAATTTGC   *  =  nM:21

Объяснение: объединить файлы в первом столбце, -v 1 = вывести несовпадающие строки из первого файл. Файлы отсортированы по их первому столбцу -k1,1 . Последний столбец -t хорошо печатает.

2
29.04.2021, 00:42

Похоже, из другого потока я смог найти ответ с помощью этого метода,

Сравнение двух файлов с использованием Unix и Awk

FNR == NR {
  f1[$1,$2,$3] = $0
  f1_c14[$1,$2,$3] = 1
  f1_c5[$1,$2,$3] = $4
  next
}

f1_c14[$1,$2,$3] {
  if ($4 != f1_c5[$1,$2,$3]) print f1[$1,$2,$3] ;
}

f1[$1,$2,$3] {
  if ($4 != f1_c5[$1,$2,$3]) print $0;
}
-1
29.04.2021, 00:42

Теги

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