Получить строки, соответствующие массиву значений для столбца - AWK

Я хотел бы спросить, есть ли какой-нибудь быстрый способ с помощью awk получить значения третьего столбца для каждой строки, которые соответствуют первому и второму столбцам с некоторыми значениями?

У меня есть ситуация, когда у меня есть в переменной массива значения для сопоставления для второго столбца файла и переменная со значением для сопоставления для первого столбца.

Итак, у меня есть переменные vals и chr:

chr = "chr1"    
vals=($(seq 4 1 10))
echo ${vals[@]}

Я хотел бы использовать их в таком скрипте:

res=$(awk '{if ($1= = "'$chr'" && $2 in "'$vals[*]'") print $3} ' $depthFile)

Скажем, у меня есть это в моем файле:

chr1 5 length=35
chr1 6 length=35
chr1 7 length=35
chr1 8 length=35
chr1 9 length=76
chr1 10 length=35
chr1 11 length=35
chr1 12 length=35
chr1 13 length=35
chr1 14 length=76

А у меня 6 7 8 9 в вальсе и chr = chr1.

Я ожидал, что при использовании echo ${res[@]}:

length=35
length=35
length=35
length=76

Пока я получаю эту ошибку. Я знаю, что возникла проблема с передачей массива vals.

awk: cmd. line:1:  {if ($1= = "chr1" && $2 in "4[*]") print $3} 
awk: cmd. line:1:                           ^ syntax error

Заранее большое спасибо!

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
222
1

Ответы 1

другой awk

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

$ awk -v key = "chr1" -v from=4 -v to=10 '$1==key && from<=$2 && $2<=to {print $3}' file

length=35
length=35
length=35
length=35
length=76
length=35

Спасибо за ответ. Хотя я попробовал это в своем файле сценария, и это не очень хорошо. Я не знаю точной причины. Я подозреваю, что это потому, что я использую переменные для чисел от и до. Я провел несколько тестов, чтобы увидеть, что происходит. В случае, если у меня есть только два условия: $1==key && $2<=to работает хорошо, но когда есть три условия или $1==key && from<=$2 , это не так. :(

MarVi 02.05.2018 05:39

Но с этим '($1==key && $2>=from ) {print $3; if ($2==to) exit;}' работает нормально!

MarVi 02.05.2018 07:03

Разве from<=$2 && $2<=to не должен быть from>=$2 && $2<=to? @MarVi, вам действительно стоит считать о коде, который вы используете, не просто копируйте / вставляйте его, а затем начинайте пробовать случайные вещи, чтобы увидеть, сможете ли вы получить ожидаемый результат.

Ed Morton 02.05.2018 15:36

Зачем? [4,10] - это $2>=4 && $2<=10, то есть включает в себя значения поля 2 от 4 до 10.

karakfa 02.05.2018 17:00

Другие вопросы по теме