Я хочу перейти к файлу и выбрать значения, основанные на имени файла и ключевом слове, присутствующем в моем файле? - PullRequest
0 голосов
/ 23 ноября 2018

Я новичок в сценариях оболочки, поэтому мне нужна вся ваша помощь для достижения моей цели.У меня есть файл с именем input.csv, который состоит из данных, как показано ниже,

G22822 277 OR2
G22822 329 OR9
G22940 286 OR3
G22940 412 OR7
G25365 289 OR3

Теперь, OR2, OR9, OR3, OR7 и OR3 также разные файлыс именем al_or2.cap, al_or9.cap, al_or3.cap, al_or7.cap и al_or3.cap по другому пути.Данные, представленные в этих файлах шапок, выглядят так, как показано ниже:

В al_or2.cap:

277 ASCII GRP 184578924
102 ASCII GRP 754815923

В al_or9.cap:

981 ASCII GRP 542189353
329 ASCII GRP 158203981

Подобно тому, как мудрые данные присутствуют во всех файлах шапки.

Если вы видите первую строку в input.csv (G22822 277 OR2) в качестве упомянутых данных, мне нужно перейти к al_or2.cap и выполнить поискдля ключевого слова 277 и печати G22822 и 542189353 (G22822 присутствует в input.csv и 542189353 присутствует в al_or2.cap).

Затем для этого G22822 329 OR9 мне нужно перейти к al_or9.cap и распечатать G22822 и 158203981.

Мой требуемый результат, например:

G22822 184578924
G22822 158203981 and so on..

Пожалуйста, помогите мне достичь моей цели.

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Если ваш исходный файл имеет 3 поля, а ваши файлы данных (например, al_or2.cap и т. Д.) Имеют 4 поля, вы можете использовать один вызов awk и встроенные функции tolower, sprintf, getline и split, чтобы сформировать имя файла, прочитать соответствующий файл и вывести результаты в желаемом порядке следующим образом:

awk '
{   lwr = tolower($3)
    str = sprintf ("al_%s.cap", lwr)
    while (getline line < str > 0) {
        split (line, a, " ", seps)
        if (a[1] == $2)
            print $1,a[4]
    }
}' file

Присутствующие файлы

$ cat file
G22822 277 OR2
G22822 329 OR9
G22940 286 OR3
G22940 412 OR7
G25365 289 OR3

$ cat al_or2.cap
277 ASCII GRP 184578924
102 ASCII GRP 754815923

$ cat al_or9.cap
981 ASCII GRP 542189353
329 ASCII GRP 158203981

Пример использования / Вывод

$ awk '
> {   lwr = tolower($3)
>     str = sprintf ("al_%s.cap", lwr)
>     while (getline line < str > 0) {
>         split (line, a, " ", seps)
>         if (a[1] == $2)
>             print $1,a[4]
>     }
> }' file
G22822 184578924
G22822 158203981

Создание простого awk сценария

Если вы хотите создатьawk-script из вышеперечисленного, вы можете сделать следующее:

#!/usr/bin/awk -f
{
    lwr = tolower($3)
    str = sprintf ("al_%s.cap", lwr)
    while (getline line < str > 0) {
        split (line, a, " ", seps)
        if (a[1] == $2)
            print $1,a[4]
    }
}

Теперь все, что вам нужно сделать, это сохранить файл и сделать его исполняемым (например, chmod +x myscript.awk, а затем

Пример использования / Вывод

$ ./myscript.awk file
G22822 184578924
G22822 158203981
0 голосов
/ 23 ноября 2018

Предполагая, что данные, которые вы представили, являются точными, и не зная структуры вашего каталога, вот что-то вроде

#!/bin/bash
while read a b c
do
  awk -v a=$a -v b=$b  'b==$1{printf "%s %s\n", a, $4}' tmp/al_$(echo $c | tr '[A-Z]' '[a-z]').cap
done < input.csv

Сохранение этого как karthik.sh, сохранив первые две строки вашего input.csvСоздав подкаталог tmp с файлами al_or2.cap и al_or9.cap в нем и запустив ./karthik.sh, я получаю следующий вывод:

./karthik.sh 
G22822 184578924
G22822 158203981
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...