Удалить строку, если одинаковое значение во всех столбцах - PullRequest
0 голосов
/ 09 октября 2018

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

Ввод:

CHROM   108 139 159 265 350 351
SNP1    -1  -1  -1  -1  -1  -1
SNP2    2   2   2   2   2   2
SNP3    0   0   0   -1  -1  -1
SNP4    1   1   1   1   1   1
SNP5    0   0   0   0   0   0

Желаемый

CHROM   108 139 159 265 350 351
SNP3    0   0   0   -1  -1  -1

Существует аналогичныйзаданный вопрос для Panda Framework ( Удалите повторяющиеся строки с одинаковыми значениями во всех столбцах панд ), и я нашел несколько частичное решение, которое удаляет строки, содержащие только ноль

awk 'NR > 1{s=0; for (i=3;i<=NF;i++) s+=$i; if (s!=0)print}' input > outfile

, но яхочу сделать это для чисел -1, 0, 1 и 2 за один раз с заголовком и 1-м столбцом в качестве идентификатора.

Любая помощь будет высоко оценена.

Ответы [ 4 ]

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

Переносимое решение Perl:

$ cat all_row
CHROM   108 139 159 265 350 351
SNP1    -1  -1  -1  -1  -1  -1
SNP2    2   2   2   2   2   2
SNP3    0   0   0   -1  -1  -1
SNP4    1   1   1   1   1   1
SNP5    0   0   0   0   0   0

$ perl -F"\s+" -ane ' { print "$_" if @F[1 .. $#F-1] != $F[1] } ' all_row
CHROM   108 139 159 265 350 351
SNP3    0   0   0   -1  -1  -1

$

если задан вопрос, не удаляйте, если одинаковое значение во всех столбцах, тогда

$ perl -F"\s+" -ane ' { print "$_" if @F[1 .. $#F-1] == $F[1] } ' all_row
SNP1    -1  -1  -1  -1  -1  -1
SNP2    2   2   2   2   2   2
SNP4    1   1   1   1   1   1
SNP5    0   0   0   0   0   0
0 голосов
/ 09 октября 2018

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

awk '{val=$2;count=1;for(i=3;i<=NF;i++){if(val==$i){count++}};if(count!=(NF-1)){print}}'  Input_file
0 голосов
/ 09 октября 2018

Вы можете попробовать это:

awk 'NR==1;NR>1{for(i=2;i<NF;i++)if($(i+1)!=$i) {print;next}}' file

Он печатает строку заголовка.
Он проходит по полям, пока не будет найдена разница со следующим, затем печатает его и переходит кследующий.

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

Я считаю, что вы можете сделать что-то вроде этого:

awk '{s=$0; gsub(FS $2,FS)} (NF > 1) {print s}' file

Какие выходы:

CHROM   108 139 159 265 350 351
SNP3    0   0   0   -1  -1  -1

Как это работает?

  1. {s=$0; gsub(FS $2,FS)}: Это действие состоит из 2 частей:

    • Сохранение текущей строки в переменной s
    • Замена в текущемстрока $0 все значения второго поля, включая его начальный разделитель полей FS (FS $2) с разделителем полей FS.Как побочный эффект, $0 переопределяется, а все переменные поля и общее количество полей NF переопределяются.Разделитель полей FS необходим, чтобы избежать совпадения xx, если $2=x
  2. (NF > 1) {print s}: Если у вас более 1 поляслева, выведите строку, это означает, что у вас есть разные цифры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...