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