Создание новых таблиц на основе определенных параметров из существующей таблицы

Предположим, что файлы не содержат символов табуляции -:

$ paste file1 file2 | awk -F '\t' '{ print ($1 == $2 ? "TRUE" : "FALSE") }'
TRUE
TRUE
FALSE
FALSE

При этом используется pasteдля создания двух столбцов с разделителями табуляцией -с содержимым двух файлов в каждом столбце. Команда awkсравнивает два столбца в каждой строке и выводит TRUE, если столбцы совпадают, и в противном случае выводит FALSE.

0
13.04.2021, 07:41
2 ответа

Я предполагаю, что

  • Ваши данные разделены пробелами, так как показано (сортировка -из ).
  • В вашей таблице всегда одиннадцать столбцов. (но, предположительно, может иметь любое количество строк ).
  • Значения ячеек никогда не содержат пробелов. (В частности, все, кроме заголовков строки 1 (). и Столбец 1 (ген )равен либо 0, либо 1.)

Это легко сделать с помощью awk.

  1. ... all data that includes "1" under a column header containing "S1", but where all headers containing "S2" have a value of "0" for that same gene.

    Другими словами,

      (2-й столбец равен 1 ИЛИ 3-й столбец равен 1 ИЛИ 4-й столбец равен 1 ИЛИ 5-й столбец равен 1 ИЛИ 6-й столбец равен 1)
      И
      7-й столбец равен 0
      И
      8-й столбец равен 0
      И
      9-й столбец равен 0
      И
      10-й столбец равен 0
      И
      11-й столбец равен 0
    Так,
    awk -v OFS=',' '
            NR==1 { next }
            ($2==1 || $3==1 || $4==1 || $5==1 || $6==1)  &&
                    $7==0 && $8==0 && $9==0 && $10==0 && $11==0 { $1=$1; print }
        '
    
    • OFS— «разделитель полей вывода». -v OFS=','указывает awkзаписывать данные с полями, разделенными запятыми -, даже если ввод был разделен табуляцией -или пробелом -.
    • NR==1 { next }указывает awkпропустить первую строку (строки заголовка ). Если вы хотите распечатать строку заголовка, измените ее на NR==1 { $1=$1; print; next }.
    • Следующие две строки кодируют описанную выше логику И/ИЛИ.
    • { $1=$1; print }печатает строку (, если она удовлетворяет условиям ). $1=$1означает, что первое поле равно самому себе. Похоже, это почти ничего не делает; по факту,это уловка, чтобы заставить awkперестроить линию с новым (пользователем -, указанным )разделителем выходных полей (, которое мы указали как запятую ). Если вы когда-нибудь передумаете и хотите вывести строки точно так, как они появляются во входных данных, удалите -v OFS=','и $1=$1;.
  2. ... only those rows in which there is a "1" value for any REF file (S1 or S2) but only "0"'s for all other fields...

    awk -v OFS=',' '
            NR==1 { next }
            ($2==1 || $3==1 || $7==1 || $8==1)  &&
                    $4==0 && $5==0 && $6==0 && $9==0 && $10==0 && $11==0 { $1=$1; print }
        '
    
  3. Where a REF_S1* contains a "1" + where all other (i.e., non-REF) S1 samples are "0" + where all REF_S2* are "0" but where any other S2 samples (non-REF) are "1".

    awk -v OFS=',' '
            NR==1 { next }
            ($2==1 || $3==1) && $4==0 && $5==0 && $6==0  &&
                    $7==0 && $8==0 && ($9==1 || $10==1 || $11==1) { $1=$1; print }
        '
    
  4. ... where any *FL is "1", and all *host are "0".

    awk -v OFS=',' '
            NR==1 { next }
            ($3==1 || $6==1 || $8==1 || $11==1)  &&
                    $2==0 && $4==0 && $5==0 && $7==0 && $9==0 && $10==0 { $1=$1; print }
        '
    
1
28.04.2021, 22:52

Эта проблема решается с использованием perl в три шага.

  • Напишите подпрограмму, которая, учитывая регулярное выражение критериев выбора, выдает номера полей которые удовлетворяют критериям.
  • Используя подпрограмму, сгенерируйте индексы полей для каждого из перечисленных критериев после чтения первой строки или строки заголовка.
  • Наконец, вооружившись этими различными массивами, мы выполняем логические критерии выбора, используя функции, импортированные из модуля List ::MoreUtils.
  • Примечание. :Запуск четырех корпусов по отдельности в одном -горячем режиме. В противном случае выходные данные будут чередоваться.
perl -MList::MoreUtils=any,all -lane '
  BEGIN {
    sub mkAry {
      my $re = shift;
      grep { $_ }
      map { $h{$_} }
      grep { /$re/ } keys %h
    }
  }
  if ($. == 1) {
    print;
    @h{@F} = (0..$#F);
    @S1 = mkAry qr/S1/;
    @S2 = mkAry qr/S2/;
    @REF = mkAry qr/REF/;
    @notREF = mkAry qr/^(?!.*REF)/;
    @REF_S1 = mkAry qr/REF_S1/;
    @REF_S2 = mkAry qr/REF_S2/;
    @notREF_S1 = mkAry qr/^(?!.*REF)(?=.*S1)/;
    @notREF_S2 = mkAry qr/^(?!.*REF)(?=.*S2)/;
    @FL = mkAry qr/FL/;
    @host = mkAry qr/host/;
    next;
  }

  ##_1_:
  print if
    any { $_ == 1 } @F[@S1] and
    all { $_ == 0 } @F[@S2]
  ;

  ##_2_:
  print if
    any { $_ == 1 } @F[@REF] and
    all { $_ == 0 } @F[@notREF]
  ;

  ##_3_:
  print if
    any { $_ == 1 } @F[@REF_S1] and
    all { $_ == 0 } @F[@notREF_S1] and
    all { $_ == 0 } @F[@REF_S2] and
    any { $_ == 1 } @F[@notREF_S2]
  ;

  ##_4_:
  print if
    any { $_ == 1 } @F[@FL] and
    all { $_ == 0 } @F[@host]
  ;
' file | column -t
0
28.04.2021, 22:52

Теги

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