gpt4 book ai didi

awk 创建用于测试元素的列表

转载 作者:行者123 更新时间:2023-12-01 23:42:36 25 4
gpt4 key购买 nike

我有一个离散元素列表,我想测试这些元素是否包含我文件的每一行中的一个条目。我想要一种简洁的方法来在 awk 中创建列表或数组,然后针对该列表测试每一行。

我的离散元素列表:

端口=(1010, 2020, 3030, 8888, 12345)

我的文件:

127.0.0.1 1010
127.0.0.1 1011
127.0.0.1 12345
127.0.0.1 3333

我的伪代码:

awk '
BEGIN {
test_ports=[1010, 2020, 3030, 8888, 12345]
}
($2 in test_ports) {
print $0
}
' myFile

下面的代码有效,但它并不简洁,而且我不喜欢它随着列表的增长而增长的方式,比如如果我有 100 个端口要测试,或者 1000...

awk '
BEGIN {
test_ports["1010"]=1
test_ports["2020"]=1
test_ports["3030"]=1
test_ports["8888"]=1
test_ports["12345"]=1
}
($2 in test_ports) {
print $0
}
' myFile

这样的东西也不错,但语法不太正确:

我在 1010 2020 3030 8888 12345 {test_ports[i]=1}

编辑

这段代码也能正常工作,非常接近我需要的,但对于它正在做的事情来说似乎还是有点长。

awk '
BEGIN {
ports="1010,2020,3030,8888,12345"
split(ports, ports_array, ",")
for (i in ports_array) {test_ports[ports_array[i]] = 1}
}
($2 in test_ports) {
print $0
}
' myFile

最佳答案

你可以这样使用它:

awk '
BEGIN {
ports = "1010 2020 3030 8888 12345" # ports string
split(ports, temp) # split by space in array temp
for (i in temp) # populate array test_ports
test_ports[temp[i]]
}

$2 in test_ports # print rows with matching ports
' myFile
127.0.0.1 1010
127.0.0.1 12345

注释说明:

  • temp 是一个数字索引数组,其中端口(1010、2020 等)是数组值,从 1 开始索引
  • test_ports 是一个关联数组,其中端口是数组,值为空。
  • elem in array 运算符测试给定元素是否是数组的索引(也称为“下标”)。

附录:如果您的端口列表很大,您还可以选择从文件中读取端口:

awk 'NR == FNR {ports[$1]; next} $2 in ports' ports.list myfile

否则,如果您将端口保存在字符串中,则使用:

ports='1010 2020 3030 8888 12345'
awk 'NR==FNR{ports[$1]; next} $2 in ports' <(printf '%s\n' $ports) myfile
127.0.0.1 1010
127.0.0.1 12345

关于awk 创建用于测试元素的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64789735/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com