这个 awk 命令到底是什么意思?

这个 awk 命令到底是什么意思?

你能给我解释一下这个命令的含义吗:

awk 'BEGIN {while (getline < "list") list[$1]}; $1 in list'

答案1

命令

awk 'BEGIN {while (getline < "list") list[$1]}; $1 in list' somefilename

这与以下相同

awk 'BEGIN {while (getline < "list") array[$1]} $1 in array' somefilename

(其中我仅将变量重命名listarray并删除了多余的;)首先从名为 的文件中读取list,然后从somefilename(或标准输入,如果somefilename未提供)中读取,并且仅打印出第一列也存在的该文件中的行在文件的第一列中list

以“长形式”编写,awk脚本可以写为

#!/usr/bin/awk -f

# This block runs before processing input data.
BEGIN {
    # Read "list" line by line.
    while (getline <"list")
        array[$1] = 1  # Make an entry in the associative array
                       # with the first column as key.
}

# This block processes data.
# If the first column of the data is a key in the array, print the whole line.
$1 in array { print } 

简而言之,这是两个文件之间第一列上的原始 JOIN 操作,其中文件不必排序(它保留 的排序顺序somefilename)。结果将是somefilename其第一列与 中的第一列之一匹配的行list

另一种(几乎)不保留顺序的方法是

join <( sort list ) <( sort somefilename )

结果的排序会有所不同,并且 的所有列list都将成为输出的一部分(如果知道需要哪一列,则可以使用-ofor 标志来修复这一问题join)。


$1将脚本中的两个位置更改为$0(整行而不仅仅是第一列)将使awk脚本等效于

grep -Fx -f list somefilename

在这里,该list文件被用作grep模式列表 ( -f list),将用于执行固定字符串 ( -F)、整行 ( -x) somefilename、.somefilename将打印来自的匹配行。

答案2

混乱可能来自于名称的过多list。也许这会让事情变得更清楚:

awk 'BEGIN { while( getline < "filename" ) myarray[$1] }'

myarray这将使用文件每一行的第一个字段填充数组filename

来自awk的手册:

“函数”[..]getline <file将 $0 设置为 中的下一条记录 file

相关内容