awk getcolumn var 而不是 getline var
awk getcolumn var instead of getline var
awk 具有我经常使用的 'getline var' 函数来提取文件的行,其中特定列(下例中的第 2 列)与另一个文件的行匹配:
awk 'BEGIN {while(getline each_line < "patterns_file.txt") my_patterns[each_line]} in my_patterns' file_to_search.txt
相反,如果数组 my_patterns 有多个列并且我只需要一个特定的列进行匹配(比如说第 4 列),我如何才能只从 patterns_file.txt 中获取指定的列到数组 my_patterns 中,类似于:
awk 'BEGIN {while(getcolumn each_4th_column < "patterns_file.txt") my_patterns[each_4th_column]} in my_patterns' file_to_search.txt
你问题中的代码是awk中的反模式。做你想做的推荐方法是这样的:
awk 'NR==FNR {my_patterns[];next} in my_patterns' patterns_file.txt file_to_search.txt
在这种情况下无需手动使用 getline
。相反,第一个块针对第一个文件运行并在数组中设置键。 FNR==NR
是确定正在处理第一个文件的惯用方式(因为 FNR
是当前文件中的记录数,而 NR
是总记录数)。使用next
表示第一个文件跳过块外的部分。
awk 具有我经常使用的 'getline var' 函数来提取文件的行,其中特定列(下例中的第 2 列)与另一个文件的行匹配:
awk 'BEGIN {while(getline each_line < "patterns_file.txt") my_patterns[each_line]} in my_patterns' file_to_search.txt
相反,如果数组 my_patterns 有多个列并且我只需要一个特定的列进行匹配(比如说第 4 列),我如何才能只从 patterns_file.txt 中获取指定的列到数组 my_patterns 中,类似于:
awk 'BEGIN {while(getcolumn each_4th_column < "patterns_file.txt") my_patterns[each_4th_column]} in my_patterns' file_to_search.txt
你问题中的代码是awk中的反模式。做你想做的推荐方法是这样的:
awk 'NR==FNR {my_patterns[];next} in my_patterns' patterns_file.txt file_to_search.txt
在这种情况下无需手动使用 getline
。相反,第一个块针对第一个文件运行并在数组中设置键。 FNR==NR
是确定正在处理第一个文件的惯用方式(因为 FNR
是当前文件中的记录数,而 NR
是总记录数)。使用next
表示第一个文件跳过块外的部分。