Awk для нескольких шаблонов для файла переменной длины

#awk

#awk

Вопрос:

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

 awk '/test_pattern/ { match($0, /test_pattern/); print substr($0, RSTART - 10, RLENGTH   20);' file
  

Как мне поступить с несколькими шаблонами? Файл основан не на столбцах, а на разделителях. Спасибо.

Вот пример для одной строки.

 X;Y;AC=1;AN=31388;AF=3.18593e-05;0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|AC_CAT=4.5;X;X;X;X;AC_DOG=4.6; X;X;X;AC_PUT=5.4
  

Я пытаюсь получить все, что начинается с AC, AF и AN. В то же время мне нужны первые два столбца, если это возможно.

Ожидаемый результат:

 X     Y    AC=1    AF=3.18593e-05  AC_CAT=4.5   AC_DOG=4.6   AC_PUT=5.4
  

Спасибо.

Комментарии:

1. Пожалуйста, опубликуйте некоторые примеры данных с соответствующими ожидаемыми результатами.

2. Только что добавлено. Спасибо

3. Извините, только что обновил его..

Ответ №1:

Я думаю, что вы AN= случайно исключили столбец из ожидаемого результата, поскольку вы сказали в своем вопросе I am trying to get everything that begins with AC, AF and AN , и на самом деле вы просто хотите, чтобы все name=value столбцы были напечатаны. Если это так:

 $ cat tst.awk
BEGIN { FS="[;|]"; OFS="t" }
{
    printf "%s%s%s", $1, OFS, $2
    for (i=3; i<=NF; i  ) {
        if ($i ~ /=/) {
            printf "%s%s", OFS, $i
        }
    }
    print ""
}

$ awk -f tst.awk file
X       Y       AC=1    AN=31388        AF=3.18593e-05  AC_CAT=4.5      AC_DOG=4.6      AC_PUT=5.4
  

Комментарии:

1. На самом деле, я хочу, чтобы были напечатаны все поля, начинающиеся с AC, AN и AF… Возможно ли это?

2. Это именно то, что вы получили. Посмотрите на результат — все поля начинаются с AC, AN и AF.

3. Понял. Спасибо.

Ответ №2:

если ваши данные в файле ‘d’, попробуйте gnu awk:

 awk 'BEGIN{FPAT="A[CFN][A-Z_]*=[0-9.] "} {for(i =1; i<=NF;i  ) print $i" "}' d