извлечь слово из файла, используя информацию из подмножества файла (несколько шагов)

Учитывая, что Вы специально просили решение проблемы:

awk -F\" '$4 !~ /eprints.ulster.ac.uk\/view/' file > newfile
-121--195342-

Попробуйте

<application name="emacs*" class="Emacs*" type="normal">
    <position force="yes">
        <x>0</x>
        <y>0</y>
    </position>
    <size>
        <height>600</height>
        <width>1024</width>
    </size>
    <decor>no</decor>
    <maximized>no</maximized>
</application>

< высота > и < ширина > должны находиться в тэге < размер > .

Из примера конфигурации Openbox

<position force="no">
  # the position is only used if both an x and y coordinate are provided
  # (and not set to 'default')
  # when force is "yes", then the window will be placed here even if it
  # says you want it placed elsewhere.  this is to override buggy
  # applications who refuse to behave
  <x>center</x>
  # a number like 50, or 'center' to center on screen. use a negative number
  # to start from the right (or bottom for <y>), ie -50 is 50 pixels from
  # the right edge (or bottom). use 'default' to specify using value
  # provided by the application, or chosen by openbox, instead.
  <y>200</y>
  <monitor>1</monitor>
  # specifies the monitor in a xinerama setup.
  # 1 is the first head, or 'mouse' for wherever the mouse is
</position>

<size>
  # the size to make the window.
  <width>20</width>
  # a number like 20, or 'default' to use the size given by the application.
  # you can use fractions such as 1/2 or percentages such as 75% in which
  # case the value is relative to the size of the monitor that the window
  # appears on.
  <height>30%</height>
</size>
-121--114122-

я не могу найти документацию для подтверждения или отклонения, но помните, что записи cron не являются сценариями оболочки. Я предполагаю, что логический или не разрешен. Добавьте логику, чтобы предотвратить несколько экземпляров (что, как я полагаю, является причиной использования pgrep) в сценарии, или создайте сценарий-оболочку, который будет запланирован в cron.

0
05.03.2018, 08:31
1 ответ

Suponiendo que tiene un espacio en blanco como delimitador:

$ while read -r id pos; do awk -v id="$id" -v pos="$pos" '$1 == id && pos > $4 && pos < $5 { print gensub(/.*gene=([A-Za-z0-9]*).*/, "\\1", 1) }' <file2; done <file1
LOC102908761
Rftn1
LOC102913870

Explicación

  • while read -r id pos; do FOO; done <file1:esto lee file1línea por línea y coloca el primer campo (p.NW_006502347.1)en la variable de shell $id, y el segundo campo (, p.316684)en la variable de shell $pos. Luego ejecuta FOOpara cada línea.
  • awk -v id="$id" -v pos="$pos" 'BAR' <file2:para cada línea de file1, ejecutaremos un comando awkque ejecutará BAR. Esto buscará file2para las partes coincidentes. Necesitamos decirle a este script awklas dos variables "externas" del shell. es decir, a la variable awk idse le asigna el mismo valor que a la variable de shell $id, y lo mismo para la variable awk posy la variable de shell $pos.
  • $1 == id && pos > $4 && pos < $5:esta es la parte "condicional" del script awk. Si se cumplen estas condiciones, se ejecutarán los siguientes comandos. Aquí, estamos comprobando si el primer campo $1de file2es el mismo que el idde la línea actual de file1, Y si posestá entre el 4 $4y el 5 $5campos de file2.
  • { print gensub(/.*gene=([A-Za-z0-9]*).*/, "\\1", 1) }:si se cumplen las condiciones anteriores, se ejecutará este código. Queremos hacer una sustitución con gensubprimero. Esto busca gene=seguido de una cadena alfanumérica de cualquier longitud ([A-Za-z0-9]*). Esta cadena alfanumérica es (capturada )por los paréntesis. También "buscaremos" todos los caracteres antes y después .*de la cadena completa gene=([A-Za-z0-9]*). Por lo tanto, esto "busca" la línea completa, que se reemplaza con el (primer y único )grupo de captura "\\1", es decir, la cadena alfanumérica después de gene=. El final 1significa reemplazar la primera aparición, aunque esto no tiene mucho sentido, ya que asumo que solo habrá una coincidencia de gene=por línea.

Pestaña -versión delimitada

Prefiero usar archivos delimitados por tabuladores -en general, especialmente para lo que supongo que es un archivo GFF/GTF. Esto permite diferenciar entre espacios, especialmente en el campo 9.

while IFS=$'\t' read -r id pos; do awk -F'\t' -v id="$id" -v pos="$pos" '$1 == id && pos > $4 && pos < $5 { print gensub(/.*gene=([A-Za-z0-9]*).*/, "\\1", 1) }' <file2.tsv ; done <file1.tsv

Las modificaciones al script están dividiendo explícitamente las líneas de shell en las pestañas con IFS=$'\t'y las líneas awkcon -F'\t'.

2
28.01.2020, 02:32

Теги

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