在循环密钥文件

时间:2018-08-03 14:14:31

标签: bash unix awk grep

我需要在另一个文件中搜索一个文件的内容。

尝试过grep,但我想要目标文件中的索引列:

grep -oFf file1 file2

源文件:

1   /data/user/parent_dir_1
2  /data/user/parent_dir_2

目标文件(制表符分隔):

     Dir_name                                    size
/data/user/parent_dir_1/child_1                  100066
/data/user/parent_dir_1/child_2/sub_child_1      465456
/data/user/parent_dir_1/child_2/sub_child_2      54564564
/data/user/parent_dir_1/child_2/sub_child_3      464645645
/data/user/parent_dir_1/child_3/sub_child_1      45454
/data/user/parent_dir_2                          1313134
/data/user/parent_dir_3                          1313134
/data/user/parent_dir_4                          1313134
/data/user/parent_dir_5                          1313134
/data/user/parent_dir_6                          1313134

预期结果:

    Dir_name                                      size      Index
/data/user/parent_dir_1/child_1                  100066      1
/data/user/parent_dir_1/child_2/sub_child_1      465456      1
/data/user/parent_dir_1/child_2/sub_child_2      54564564    1
/data/user/parent_dir_1/child_2/sub_child_3      464645645   1
/data/user/parent_dir_1/child_3/sub_child_1      45454       1  
/data/user/parent_dir_2                          1313134     2

到目前为止,我有

awk -F, 'FNR==NR{k[$1]=1;next;} FNR==1 || k[$1]' Source_File Target_File

但是由于某种原因,它仅打印目标文件的标题,而没有其他内容。

1 个答案:

答案 0 :(得分:1)

问题:

  1. -F,不适当,因为您的数据未经过逗号限制
  2. 源文件的第一列只是目标文件的第一列的子字符串。您需要为此使用index函数。

您可以使用此awk;

awk -v OFS='\t' 'FNR==NR{k[$2]=$1;next;} FNR==1{print $0, "Index"}
{for (i in k) if (index($1, i)) 
{print $0, k[i]; break}}' Source_File Target_File | column -t

Dir_name                                     size       Index
/data/user/parent_dir_1/child_1              100066     1
/data/user/parent_dir_1/child_2/sub_child_1  465456     1
/data/user/parent_dir_1/child_2/sub_child_2  54564564   1
/data/user/parent_dir_1/child_2/sub_child_3  464645645  1
/data/user/parent_dir_1/child_3/sub_child_1  45454      1
/data/user/parent_dir_2                      1313134    2