代码之家  ›  专栏  ›  技术社区  ›  Dvusrgme

循环密钥文件时使用AWK搜索另一个数据文件

  •  2
  • Dvusrgme  · 技术社区  · 6 年前

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

    尝试 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 回复  |  直到 6 年前
        1
  •  1
  •   anubhava    6 年前

    两个问题:

    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