Как выбрать строки на основе того, сколько раз подряд число присутствует в столбце?

Я не стал вводить букву «c» в параметре -c как букву, отличную от ASCII. Вот в чем проблема. Я исправил это, и проблема исчезла.

Убедитесь, что вы набираете команды bash и их параметры в ASCII.

1
04.12.2016, 20:28
2 ответа

Решение с awk :

awk 'FNR==NR{c[$4]++;next;} c[$4]==3' file.dat file.dat

Вывод:

chr1    3000823 3000829 1  
chr1    3001003 3001009 1  
chr1    3001014 3001020 1  
chr1    3007426 3007432 10      
chr1    3007528 3007534 10  
chr1    3007576 3007582 10

Пояснение:

  • FNR == NR : Этот тест верен, когда количество записей равно количеству записей в файле. Это верно только для первого файла, для второго файла NR будет равно количеству строк в файле1 + FNR.
  • c [$ 4] ++ : увеличить индекс элемента массива на $ 4 . Я использую это как счетчик.
  • next : переход к следующей записи, ничего не делая.
  • c [$ 4] == 3 : это происходит только с записями второго файла. Если этот тест прошел успешно, строка будет напечатана, поскольку печать является действием по умолчанию в awk .

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

3
27.01.2020, 23:19
{
  i = int(count[$4])
  arr[$4,i] = $0
  count[$4]++
} 

END {
  for (i in count) {
    if (count[i]== n) {
      for (j=0; j<n; j++) {
        printf("%s\n", arr[i,j])
      } 
    } 
  }
}

sample run --

awk -v n=3 -f 1.awk 1.dat 
chr1 3007426 3007432 10
chr1 3007528 3007534 10
chr1 3007576 3007582 10 
chr1 3000823 3000829 1
chr1 3001003 3001009 1
chr1 3001014 3001020 1

awk -v n=8 -f 1.awk 1.dat 
chr1 3003222 3003228 4
chr1 3003335 3003341 4
chr1 3003375 3003381 4
chr1 3003578 3003584 4
chr1 3003636 3003642 4
chr1 3003717 3003723 4
chr1 3003881 3003887 4
1
27.01.2020, 23:19

Теги

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