Удалить кусок строк в соответствии с серийными номерами

~ / - лишь одно из нескольких волшебных « Расширений Тильды ». Расширения тильды особенно связаны с оболочками UNIX. В отличие от $ HOME, расширения тильды не универсальны и могут варьироваться от оболочки к оболочке. Единственная общность - это соблюдение стандарта POSIX (по большей части), и, согласно Википедии, стандарт оболочки POSIX основан на «строгом подмножестве» оболочки Korn, производной от оболочки Bourne. Потомки оболочки Bourne включают, в частности, bash и zsh. Вот что POSIX говорит о расширениях тильды :

«Префикс тильды» состоит из символа без кавычек в начале слова , за которым следуют все символы, предшествующие {{ 1}} первым без кавычек в слове или все символы в слове , если их нет. В присвоении (см. Назначение переменной XBD ) можно использовать несколько префиксов тильды: в начале слова (то есть после присвоения), после любого без кавычек или и того, и другого.Префикс тильды в присвоении завершается первым без кавычек или. Если ни один из символов в префиксе тильды не заключен в кавычки, символы в префиксе тильды после символа рассматриваются как возможное имя для входа из базы данных пользователей. Переносимое имя входа не может содержать символы вне набора, указанного в описании переменной среды LOGNAME в других переменных среды XBD. Если имя входа пустое (т. Е. Префикс тильды содержит только тильду ), префикс тильды заменяется значением переменной HOME. Если HOME не задан, результаты не указаны. В противном случае префикс тильды должен быть заменен на путь к исходному рабочему каталогу , связанный с именем входа, полученным с помощью функции getpwnam () , как определено в Системных интерфейсах. том POSIX.1-2008. Если система не распознает имя для входа, результаты будут неопределенными.

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

В основном это означает, что ~ дает ссылки $ HOME и ~ foo / на начальный рабочий каталог пользователя foo. Примерно, но не всегда имеется в виду домашний каталог foo. (единственное исключение, о котором я могу думать, это root)

В BaSH они не придерживаются этого стандарта для тильд-разложений в несколькими способами , и это не особенно важно. У BaSH также есть другие забавные расширения тильды, ссылка любезно предоставлена ​​комментатором @phk. Вы можете собрать их все!


Но я отвлекся.Если мы говорим о том, что называется ~ /, я не уверен, имеете ли вы в виду термин для самого пути (в форме ~ / x / y / z ) или для феномен использования ~ / для создания указанного пути (например, произведение искусства против искусства, производное против дифференциации). Поскольку ~ / paths и ~ / расширенные пути , похоже, относятся к первому, а ~ / синтаксис и ~ / нотация - ко второму) . Я, наверное, слишком усложняю, но язык - вещь непостоянная. Например, ~ / paths подчеркивает, что форма путей начинается с ~ / , а ~ / extended paths подчеркивает функцию ~ / ] выполняет создание пути этой формы.

В любом случае, к настоящему времени вы, вероятно, поняли, что

не существует общепринятого названия

, поскольку все эти термины находятся в обращении, и этому вопросу не было уделено официального внимания, о котором мы знаем от держав, которые быть. Или, говоря иначе, все эти термины представляют собой способы описания одного и того же, а не конкурирующие ярлыки. У них нет официального названия, но любой, кто немного знает bash, сразу поймет, что они означают - и если люди поймут, о чем вы говорите, кого волнует, как вы это называете? Вы сами решаете, какой термин вам нравится. Лично мне нравится ~ / paths , произносится как «пути с тильдой и косой чертой» . И для обращения к феномену «сокращенное обозначение тильды-косой черты» . Если честно, я даже не думаю, что им нужно имя ...

2
17.06.2017, 00:40
3 ответа

awkрешение:

awk -F':' -v RS="@" 'NR>1 && ($5<1101 || $5>1103){ print RS$0 }' myfile.fq

Вывод:

@ST-E00204:114:HHKTJALXX:4:1104:7101:2012 2:N:0:1
NATTTAAAAATACCCACTATAAAACATAAAATATAACAAAAAAACTAAAAATCATAAAAAATAAAAAAAATCCACTTCACGTCTTTTAACAATTTCGTCATTTTTAACATCCTCAAATAAATTATTCTCATTTTCCATAACTTCCAATTTT
+
!A-A-FJJJJJJ-FJAJFJJJJJFJJAJJJJJJ-F-AJJJJJJ-F-FJJFJJFJFFFFF<-F

Details:

  • -F':'- разделитель полей :

  • -v RS="@ "- считать @разделителем записей

  • ($5<1101 || $5>1103)- проверить, соответствует ли нужное поле условию "удалить между 1101 и 1103 "

2
27.01.2020, 22:03
sed -e '
   /@/s/:/\n/4; /@/s/:/\n/4
   /\n110[1-3]\n/,/^$/d
   y/\n/:/
' fastq.data

  1. Отметьте серийный номер в строках, начинающихся с @.
  2. Удалить фрагмент, содержащий серийный номер 1101, 1102 или 1103.
  3. На всех остальных фрагментах уберите маркеры и позвольте им перейти в стандартный вывод.

Результат

@ST-E00204:114:HHKTJALXX:4:1104:7101:2012 2:N:0:1
NATTTAAAAATACCCACTATAAAACATAAAATATAACAAAAAAACTAAAAATCATAAAAAATAAAAAAAATCCACTTCACGTCTTTTAACAATTTCGTCATTTTTAACATCCTCAAATAAATTATTCTCATTTTCCATAACTTCCAATTTT
+
!A-A-FJJJJJJ-FJAJFJJJJJFJJAJJJJJJ-F-AJJJJJJ-F-FJJFJJFJFFFFF<-F
0
27.01.2020, 22:03

Вот решение awk, которое предполагает, что каждый блок имеет длину ровно 4 строки.

awk -F ':' '
    NR % 4 == 1 { keep = ($5 < 1101 || $5 > 1103) }
    keep
'

Пояснения:

  • -F :устанавливает разделитель полей на :. $5— пятое поле в текущей строке (, пронумерованное от 1 ).
  • NR % 4 == 1 { … }выполняет код в фигурных скобках, если условие NR % 4 == 1верно, т.е. если номер текущей строки кратен 4 плюс 1.
  • keep = (…)устанавливает переменную keepв заданное состояние.
  • Строка, содержащая только keep, указывает на то, что нужно напечатать текущую строку, если переменная keepверна. Поскольку keepустанавливается только через каждые 4 строки, он одинаково применяется ко всем строкам в 4-строчном блоке -.
1
27.01.2020, 22:03

Теги

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