Я хотел бы спросить, есть ли какой-нибудь быстрый способ с помощью 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
Заранее большое спасибо!
другой 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>=from ) {print $3; if ($2==to) exit;}'
работает нормально!
Разве from<=$2 && $2<=to
не должен быть from>=$2 && $2<=to
? @MarVi, вам действительно стоит считать о коде, который вы используете, не просто копируйте / вставляйте его, а затем начинайте пробовать случайные вещи, чтобы увидеть, сможете ли вы получить ожидаемый результат.
Зачем? [4,10]
- это $2>=4 && $2<=10
, то есть включает в себя значения поля 2 от 4 до 10.
Спасибо за ответ. Хотя я попробовал это в своем файле сценария, и это не очень хорошо. Я не знаю точной причины. Я подозреваю, что это потому, что я использую переменные для чисел от и до. Я провел несколько тестов, чтобы увидеть, что происходит. В случае, если у меня есть только два условия:
$1==key && $2<=to
работает хорошо, но когда есть три условия или$1==key && from<=$2
, это не так. :(