你能给我解释一下这个命令的含义吗:
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
(其中我仅将变量重命名list
为array
并删除了多余的;
)首先从名为 的文件中读取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
都将成为输出的一部分(如果知道需要哪一列,则可以使用-o
for 标志来修复这一问题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
。