awk getcolumn var而不是getline var

时间:2015-03-05 11:51:44

标签: awk getline

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

1 个答案:

答案 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意味着跳过块外部的第一个文件。