преобразовать в NA, если число меньше 5 - PullRequest
0 голосов
/ 09 октября 2018

У меня большой разделенный пробелами файл с тысячами строк и столбцов.Я хотел бы преобразовать значение в NA, если его число меньше 5 в строке.

Ввод:

CHROM   108 139 159 265 350 450 461 559 765 850
SNP1    0   0   0   0   0   0   2   2   2   2
SNP2    2   2   2   2   2   0   0   0   0   0
SNP3    -1  -1  -1  -1  0   0   0   0   0   0
SNP4    0   0   0   -1  -1  2   2   2   2   2
SNP5    1   1   1   1   1   1   0   0   0   0

Вывод:

CHROM   108 139 159 265 350 450 461 559 765 850
SNP1    0   0   0   0   0   0   N.A N.A N.A N.A
SNP2    2   2   2   2   2   0   0   0   0   0
SNP3    N.A N.A N.A N.A 0   0   0   0   0   0
SNP4    N.A N.A N.A N.A N.A 2   2   2   2   2
SNP5    1   1   1   1   1   1   N.A N.A N.A N.A

Я используюэти команды для достижения желаемого результата:

Рассчитать счетчик для нуля:

awk -F'|' 'BEGIN{print "count", "lineNum"}{print gsub(/0/,"") "\t" NR}' input_ > output_1 

Извлечение столбца подсчета:

awk '{print $1}' output_1 > output_1_col_1

Слияние отсчета с исходным файлом:

paste -d " " output_1_col_1 original_file > output_2

Преобразовать значение в NA, где число меньше 5:

awk '$1 < 6{gsub("0","N.A")}1' output_2 > Final_output

Аналогичным образом я повторяю эти шаги для вычисления количества для 1, 2 и -1.

Есть лиЕсть ли лучший и быстрый способ получить желаемый результат?

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

С помощью одного прохода по файлу: все равно нужно перебирать поля дважды.

awk '
    FNR > 1 {
        delete count
        for (i=2; i<=NF; i++) count[$i]++
        for (i=2; i<=NF; i++) if (count[$i] < 5) $i = "N.A"
    }
    1
' file | column -t
0 голосов
/ 09 октября 2018

Не могли бы вы попробовать следующее.

awk '
FNR==1{
  if(++count==1){
    print
  }
  next
}
FNR==NR{
  for(i=2;i<=NF;i++){
    a[FNR,$i]++
  }
  next
}
{
  for(i=2;i<=NF;i++){
    $i=a[FNR,$i]<5?"N.A":$i
  }
}
1
'  Input_file  Input_file

Вывод будет следующим.

CHROM   108 139 159 265 350 450 461 559 765 850
SNP1 0 0 0 0 0 0 N.A N.A N.A N.A
SNP2 2 2 2 2 2 0 0 0 0 0
SNP3 N.A N.A N.A N.A 0 0 0 0 0 0
SNP4 N.A N.A N.A N.A N.A 2 2 2 2 2
SNP5 1 1 1 1 1 1 N.A N.A N.A N.A
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...