Передача нескольких номеров по конвейеру в Sed

Посмотрите справочную страницу openbox . Я бы начал с переключателя - debug , когда вы его вызываете.

выдержка

--debug            Display debugging output.
--debug-focus      Display debugging output for focus handling.
--debug-xinerama   Split the display into two fake xinerama regions, if 
                   xinerama is not already enabled. This is for debugging 
                   xinerama support.

Справочная страница Help: Actions также может быть полезна, если вам нужно глубже понять, что происходит.

2
23.02.2019, 01:38
3 ответа

Вы не показали ожидаемый результат, но, если я вас правильно понял, вы ищете что-то вроде этого(fileесть данные из вашего вопроса):

$ sort -t= -k3 -rn file | awk '{a[$2]=$0}END{for(i in a){print a[i]}}'
2185 24 MID=23 GO=1
1893 48 MID=47 GO=1
2219 58 MID=57 GO=1
2374 213 MID=212 GO=1
2394 233 MID=232 GO=1

Идея состоит в том, чтобы сначала отсортировать ввод по значению GO. -t=устанавливает разделитель полей sortв =, что делает число после GOтретьим полем. Мы сортируем по этому, в обратном числовом порядке, чтобы большие числа шли первыми. Затем awkсохранит каждую строку как значение в массиве a, ключами которого являются вторые поля. Поскольку файл сортируется по значению GO, это означает, что мы всегда будем сохранять наибольшее значение для каждого $2. Затем в конце файла мы печатаем массив.


Кроме того, вы можете сделать все это прямо из исходного файла:

$ awk -F'[\t=;]' '/^[^#]/{
                    if(!a[$1$2] || a[$1$2]>$17){
                        line[$1$2]=$0; 
                        a[$1$2]=$17
                    }
                   } 
                   END{
                    for(i in a){
                        print line[i]
                    }
                   }' file.vcf 
1   1  .   A   T   1000    PASS    MID=0;S=0.0324764;DOM=0.5;PO=1;GO=1;MT=0;AC=200;DP=1000 GT  1|1 1|1 1|1 1|1 1|1 1|1 1|1 1|1 1|1
1   2  .   A   T   1000    PASS    MID=1;S=0.0125739;DOM=0.5;PO=1;GO=1;MT=5;AC=200;DP=1000 GT  1|1 1|1 1|1 1|1 1|1 1|1 1|1 1|1 1|1
1   3  .   A   T   1000    PASS    MID=2;S=-0.0693919;DOM=0.5;PO=1;GO=1;MT=9;AC=200;DP=1000    GT  1|1 1|1 1|1 1|1 1|1 1|1 1|1 1|1
1   4  .   A   T   1000    PASS    MID=3;S=0.0611535;DOM=0.5;PO=1;GO=1;MT=12;AC=200;DP=1000    GT  1|1 1|1 1|1 1|1 1|1 1|1 1|1 1|1
1   5  .   A   T   1000    PASS    MID=4;S=-0.0791182;DOM=0.5;PO=1;GO=1;MT=16;AC=200;DP=1000   GT  1|1 1|1 1|1 1|1 1|1 1|1 1|1 1|1
1   6  .   A   T   1000    PASS    MID=5;S=0.0463103;DOM=0.5;PO=1;GO=1;MT=21;AC=200;DP=1000    GT  1|1 1|1 1|1 1|1 1|1 1|1 1|1 1|1
1   7  .   A   T   1000    PASS    MID=6;S=0.0509527;DOM=0.5;PO=1;GO=1;MT=25;AC=200;DP=1000    GT  1|1 1|1 1|1 1|1 1|1 1|1 1|1 1|1
1   8  .   A   T   1000    PASS    MID=7;S=-0.0134404;DOM=0.5;PO=1;GO=1;MT=28;AC=200;DP=1000   GT  1|1 1|1 1|1 1|1 1|1 1|1 1|1 1|1
1   9  .   A   T   1000    PASS    MID=8;S=-0.00478324;DOM=0.5;PO=1;GO=1;MT=32;AC=200;DP=1000  GT  1|1 1|1 1|1 1|1 1|1 1|1 1|1 1|1
1   10 .   A   T   1000    PASS    MID=9;S=0.03588;DOM=0.5;PO=1;GO=1;MT=36;AC=200;DP=1000  GT  1|1 1|1 1|1 1|1 1|1 1|1 1|1 1|1 1|1
1   11 .   A   T   1000    PASS    MID=10;S=-0.028843;DOM=0.5;PO=1;GO=1;MT=41;AC=200;DP=1000   GT  1|1 1|1 1|1 1|1 1|1 1|1 1|1 1|1
1   12 .   A   T   1000    PASS    MID=11;S=-0.0832497;DOM=0.5;PO=1;GO=1;MT=45;AC=200;DP=1000  GT  1|1 1|1 1|1 1|1 1|1 1|1 1|1 1|1
1   13 .   A   T   1000    PASS    MID=12;S=0.0389281;DOM=0.5;PO=1;GO=1;MT=48;AC=200;DP=1000   GT  1|1 1|1 1|1 1|1 1|1 1|1 1|1 1|1
1   14 .   A   T   1000    PASS    MID=13;S=0.0362106;DOM=0.5;PO=1;GO=1;MT=53;AC=200;DP=1000   GT  1|1 1|1 1|1 1|1 1|1 1|1 1|1 1|1
1   15 .   A   T   1000    PASS    MID=14;S=0.0375309;DOM=0.5;PO=1;GO=1;MT=57;AC=200;DP=1000   GT  1|1 1|1 1|1 1|1 1|1 1|1 1|1 1|1
1   16 .   A   T   1000    PASS    MID=15;S=0.0112808;DOM=0.5;PO=1;GO=1;MT=60;AC=200;DP=1000   GT  1|1 1|1 1|1 1|1 1|1 1|1 1|1 1|1
1   17 .   A   T   1000    PASS    MID=16;S=0.0243286;DOM=0.5;PO=1;GO=1;MT=65;AC=200;DP=1000   GT  1|1 1|1 1|1 1|1 1|1 1|1 1|1 1|1
1   18 .   A   T   1000    PASS    MID=17;S=0.0596463;DOM=0.5;PO=1;GO=1;MT=69;AC=200;DP=1000   GT  1|1 1|1 1|1 1|1 1|1 1|1 1|1 1|1
1   24 .   A   T   1000    PASS    MID=23;S=-0.0086571;DOM=0.5;PO=1;GO=1;MT=92;AC=199;DP=1000;MULTIALLELIC GT  1|1 1|1 1|1 1|1 1|1 1|1 1|1
1   58 .   A   T   1000    PASS    MID=57;S=-0.0926969;DOM=0.5;PO=1;GO=1;MT=229;AC=198;DP=1000;MULTIALLELIC    GT  1|1 0|1 1|1 1|1 0|1 1|1
1   213.   A   T   1000    PASS    MID=212;S=-0.0925562;DOM=0.5;PO=1;GO=1;MT=848;AC=196;DP=1000;MULTIALLELIC   GT  1|1 1|1 1|1 1|1 1|1 1|1
1   233.   A   T   1000    PASS    MID=232;S=-0.0868037;DOM=0.5;PO=1;GO=1;MT=929;AC=199;DP=1000;MULTIALLELIC   GT  1|1 1|1 1|1 1|1 1|1 1|1

Здесь трюк заключается в -F'[\t=;]', который устанавливает разделитель полей ввода awk на любой из \t, =или ;. Это делает поле значения GO равным 17 (, предполагая, что все ваши строки имеют одинаковую структуру, если это не так, спросите в Биоинформатика , так как это будет лучше обрабатываться другими инструментами ). Остальные средства:

  • /^[^#]/{ }:сделайте это в строках, которые не начинаются с #.
  • if(a[$1$2]<$17){:если значение, хранящееся в массиве aдля первого и второго полей (хромосома и положение ), меньше, чем 17-е поле этой строки
  • line[$1$2]=$0;:сохраните эту строку как значение комбинации полей 1 и 2 в массиве line.
  • a[$1$2]=$17:сохранить 17-е поле как значение комбинации первого и второго полей в массиве a.
  • END{for(i in a){print a[i]}}:как и выше, выведите строки.

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

Один, по общему признанию, неэлегантный способ избежать этой проблемы состоит в том, чтобы в основном делать то, что вы изначально просили, и использовать номера строк.Что-то вроде:

awk -F'[\t=;]' 'NR==FNR && /^[^#]/{
                    if(!a[$1$2] || a[$1$2]>$17){
                        want[$1$2]=NR; 
                        a[$1$2]=$17
                    }
                } 
                NR!=FNR && want[$1$2]==FNR' file.vcf file.vcf
4
27.01.2020, 21:50

Вы можете передать сценарий sed через стандартный ввод с обычным именем -. Отработка предоставленного образца и удаление неиспользованных $9,

grep -n = full.txt \
| awk -F'[:;\t]' '{sub(/.*=/,"",$13); print $1,$3,$13 }' \
| sort -nk2,3 \
| awk 'last==$2{print $1"d"}last=$2' \
# | sed -i -f- full.txt

Если вы используете Mac, они сделали расширение для резервного копирования обязательным, вам нужно будет сказать sed -i '' etc, чтобы отключить его.

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

Когда я подставляю $1"p"вместо $1"d"и запускаю его через |sed -nf- full.txt, чтобы напечатать строки, которые он удалит, я получаю

$ grep -n = full.txt     | awk -F'[:;\t]' '{sub(/.*=/,"",$13); print $1,$3,$13 }'     | sort -nk2,3     | awk 'last==$2{print $1"p"}{last=$2}' | sed -nf- full.txt
1       213    .       A       T       1000    PASS    MID=477;S=0.0600971;DOM=0.5;PO=1;GO=1037;MT=849;AC=4;DP=1000;MULTIALLELIC       GT      0|0     0|0     0|0     0|0     0|0     0|0
1       58     .       A       T       1000    PASS    MID=595;S=0.0450203;DOM=0.5;PO=1;GO=1057;MT=228;AC=2;DP=1000;MULTIALLELIC       GT      0|0     1|0     0|0     0|0     1|0     0|0
1       233    .       A       T       1000    PASS    MID=668;S=-0.0447337;DOM=0.5;PO=1;GO=1070;MT=928;AC=1;DP=1000;MULTIALLELIC      GT      0|0     0|0     0|0     0|0     0|0     0|0
1       24     .       A       T       1000    PASS    MID=752;S=-0.104791;DOM=0.5;PO=1;GO=1083;MT=93;AC=1;DP=1000;MULTIALLELIC        GT      0|0     0|0     0|0     0|0     0|0     0|0
$
1
27.01.2020, 21:50

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

$ sort -t ' ' -k2,2 -k4.4n file | sort -u -k2,2
2374 213 MID=212 GO=1
2394 233 MID=232 GO=1
2185 24 MID=23 GO=1
1893 48 MID=47 GO=1
2219 58 MID=57 GO=1

Это строки данных с наименьшим GOзначением для каждой группы (, где второе поле определяет группу ).

Первый sortсортирует данные таким образом, что значения каждой группы GOупорядочены от меньшего к большему. Что в-k4.4nдолжна быть точка, а не запятая. Он указывает фактическое значение после =в четвертом поле в качестве вторичного ключа сортировки.

Второй sortиспользует только номер группы во втором поле и выполняет уникальную сортировку. Это приводит к тому, что в выводе остается только первая строка каждой уникальной группы.


Использование необработанных данных, позже добавленных к вопросу:

sed 's/\./;./' file |
sort -t ';' -k1,1 -k6.4,6n |
sort -u -t ';' -k1,1 |
sed 's/;\././' |
sort -k1,1n -k2,2n

Первые два вызова sortвыполняют те же операции, что и в предыдущей части этого ответа. Здесь мы используем первые два столбца (хромосомы и позицию )в качестве «группового ключа».

Первый sedзаменяет точку в столбце 3 на ;.. Это сделано для того, чтобы мы могли правильно использовать ;в качестве разделителя полей в двух вызовах sort. Второй вызов sedвосстанавливает исходные точки.

Окончательный sortполучает данные, отсортированные по хромосомам и положению, как с самого начала.

Это приводит к

#CHROM  POS     ID      REF     ALT     QUAL    FILTER  INFO    FORMAT  i0      i1      i2      i3      i4      i5      i6      i7      i8      i9      i10     i11     i12     i13     i14
1       1      .       A       T       1000    PASS    MID=0;S=0.0324764;DOM=0.5;PO=1;GO=1;MT=0;AC=200;DP=1000 GT      1|1     1|1     1|1     1|1     1|1     1|1     1|1     1|1     1|1
1       2      .       A       T       1000    PASS    MID=1;S=0.0125739;DOM=0.5;PO=1;GO=1;MT=5;AC=200;DP=1000 GT      1|1     1|1     1|1     1|1     1|1     1|1     1|1     1|1     1|1
1       3      .       A       T       1000    PASS    MID=2;S=-0.0693919;DOM=0.5;PO=1;GO=1;MT=9;AC=200;DP=1000        GT      1|1     1|1     1|1     1|1     1|1     1|1     1|1     1|1
1       4      .       A       T       1000    PASS    MID=3;S=0.0611535;DOM=0.5;PO=1;GO=1;MT=12;AC=200;DP=1000        GT      1|1     1|1     1|1     1|1     1|1     1|1     1|1     1|1
1       5      .       A       T       1000    PASS    MID=4;S=-0.0791182;DOM=0.5;PO=1;GO=1;MT=16;AC=200;DP=1000       GT      1|1     1|1     1|1     1|1     1|1     1|1     1|1     1|1
1       6      .       A       T       1000    PASS    MID=5;S=0.0463103;DOM=0.5;PO=1;GO=1;MT=21;AC=200;DP=1000        GT      1|1     1|1     1|1     1|1     1|1     1|1     1|1     1|1
1       7      .       A       T       1000    PASS    MID=6;S=0.0509527;DOM=0.5;PO=1;GO=1;MT=25;AC=200;DP=1000        GT      1|1     1|1     1|1     1|1     1|1     1|1     1|1     1|1
1       8      .       A       T       1000    PASS    MID=7;S=-0.0134404;DOM=0.5;PO=1;GO=1;MT=28;AC=200;DP=1000       GT      1|1     1|1     1|1     1|1     1|1     1|1     1|1     1|1
1       9      .       A       T       1000    PASS    MID=8;S=-0.00478324;DOM=0.5;PO=1;GO=1;MT=32;AC=200;DP=1000      GT      1|1     1|1     1|1     1|1     1|1     1|1     1|1     1|1
1       10     .       A       T       1000    PASS    MID=9;S=0.03588;DOM=0.5;PO=1;GO=1;MT=36;AC=200;DP=1000  GT      1|1     1|1     1|1     1|1     1|1     1|1     1|1     1|1     1|1
1       11     .       A       T       1000    PASS    MID=10;S=-0.028843;DOM=0.5;PO=1;GO=1;MT=41;AC=200;DP=1000       GT      1|1     1|1     1|1     1|1     1|1     1|1     1|1     1|1
1       12     .       A       T       1000    PASS    MID=11;S=-0.0832497;DOM=0.5;PO=1;GO=1;MT=45;AC=200;DP=1000      GT      1|1     1|1     1|1     1|1     1|1     1|1     1|1     1|1
1       13     .       A       T       1000    PASS    MID=12;S=0.0389281;DOM=0.5;PO=1;GO=1;MT=48;AC=200;DP=1000       GT      1|1     1|1     1|1     1|1     1|1     1|1     1|1     1|1
1       14     .       A       T       1000    PASS    MID=13;S=0.0362106;DOM=0.5;PO=1;GO=1;MT=53;AC=200;DP=1000       GT      1|1     1|1     1|1     1|1     1|1     1|1     1|1     1|1
1       15     .       A       T       1000    PASS    MID=14;S=0.0375309;DOM=0.5;PO=1;GO=1;MT=57;AC=200;DP=1000       GT      1|1     1|1     1|1     1|1     1|1     1|1     1|1     1|1
1       16     .       A       T       1000    PASS    MID=15;S=0.0112808;DOM=0.5;PO=1;GO=1;MT=60;AC=200;DP=1000       GT      1|1     1|1     1|1     1|1     1|1     1|1     1|1     1|1
1       17     .       A       T       1000    PASS    MID=16;S=0.0243286;DOM=0.5;PO=1;GO=1;MT=65;AC=200;DP=1000       GT      1|1     1|1     1|1     1|1     1|1     1|1     1|1     1|1
1       18     .       A       T       1000    PASS    MID=17;S=0.0596463;DOM=0.5;PO=1;GO=1;MT=69;AC=200;DP=1000       GT      1|1     1|1     1|1     1|1     1|1     1|1     1|1     1|1
1       24     .       A       T       1000    PASS    MID=23;S=-0.0086571;DOM=0.5;PO=1;GO=1;MT=92;AC=199;DP=1000;MULTIALLELIC GT      1|1     1|1     1|1     1|1     1|1     1|1     1|1
1       58     .       A       T       1000    PASS    MID=57;S=-0.0926969;DOM=0.5;PO=1;GO=1;MT=229;AC=198;DP=1000;MULTIALLELIC        GT      1|1     0|1     1|1     1|1     0|1     1|1
1       213    .       A       T       1000    PASS    MID=212;S=-0.0925562;DOM=0.5;PO=1;GO=1;MT=848;AC=196;DP=1000;MULTIALLELIC       GT      1|1     1|1     1|1     1|1     1|1     1|1
1       233    .       A       T       1000    PASS    MID=232;S=-0.0868037;DOM=0.5;PO=1;GO=1;MT=929;AC=199;DP=1000;MULTIALLELIC       GT      1|1     1|1     1|1     1|1     1|1     1|1

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

Также обратите внимание, что при извлечении данных через этапы конвейера вы теряете данные, которые не передаете.Это еще больше усложняет возможность изменения исходных данных (одним конвейером, потому что они теряются по пути через конвейер ).

Таким образом, решение состоит не в извлечении или вычислении того, что следует отбросить, а в передаче битов данных, которые следует сохранить.

4
27.01.2020, 21:50

Теги

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