我想转到文件并根据文件中存在的文件名和关键字来获取值吗?

时间:2018-11-23 08:30:36

标签: linux shell unix

我是Shell脚本的新手,所以我需要您的所有帮助才能实现我的目标。我有一个名为input.csv的文件,其中包含如下所示的数据,

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

现在,OR2OR9OR3OR7OR3也是名称分别为al_or2.cap,{{ 1}},al_or9.capal_or3.capal_or7.cap在不同的路径中。这些上限文件中的数据如下所示,

在al_or2.cap中:

al_or3.cap

在al_or9.cap中:

277 ASCII GRP 184578924
102 ASCII GRP 754815923

与所有封顶文件中的数据一样。

如果您看到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。

我所需的输出,例如:

981 ASCII GRP 542189353
329 ASCII GRP 158203981

请帮助我实现目标。

2 个答案:

答案 0 :(得分:2)

假设您提供的数据是准确的,并且不知道您的目录结构,那么这里有一些内容

#!/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.capal_or9.cap,并运行{{ 1}}我得到以下输出:

./karthik.sh

答案 1 :(得分:1)

如果原始文件具有3个字段,而数据文件(例如al_or2.cap等)都具有4个字段,则可以使用一次调用awk和内置函数{ {1}},tolowersprintfgetline形成文件名,读取相应的文件并按所需顺序输出结果,如下所示:

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