Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 在循环密钥文件时使用AWK搜索另一个数据文件_Bash_Unix_Awk_Grep - Fatal编程技术网

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

Bash 在循环密钥文件时使用AWK搜索另一个数据文件,bash,unix,awk,grep,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/pa

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

尝试了
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
目标文件(制表符分隔):

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
到目前为止,我已经

    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
但由于某些原因,它只打印目标文件的头,而不打印其他文件

两个问题:

  • -F,
    不合适,因为您的数据没有逗号删除
  • 源文件的第一列只是目标文件第一列的子字符串。您需要使用
    索引
    函数来实现这一点
  • 您可以使用此
    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
    


    谢谢现在我可以看到结果了。。。。如何在输出中从源文件捕获索引?再次感谢。这正是我要找的。我必须检查为什么在运行进程时进程会被终止。我的目标文件很大~2000万条记录。脚本花费了相当多的时间,但没有产生任何结果。我试图使用不带索引的awk输出的输出组合作为带索引的输出的输入。这样,要处理的总行数将从20M减少到7M。祝你好运。但是,知道最新的awk是否需要很长时间吗?如果
    Target\u文件
    很大,则将其拆分为较小的块,然后运行
    awk
    命令