我是Shell脚本的新手,所以我需要您的所有帮助才能实现我的目标。我有一个名为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
,{{ 1}},al_or9.cap
,al_or3.cap
和al_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
请帮助我实现目标。
答案 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.cap
和al_or9.cap
,并运行{{ 1}}我得到以下输出:
./karthik.sh
答案 1 :(得分:1)
如果原始文件具有3个字段,而数据文件(例如al_or2.cap
等)都具有4个字段,则可以使用一次调用awk
和内置函数{ {1}},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