Arrays 用于处理一个文件并读取另一个文件的AWK脚本
我已经编写了一个AWK脚本来处理一个文本文件,现在需要扩展它,以便处理的输出根据第一个文件中的字段从另一个文件获取数据。这里有一个例子来说明我的意思 File1.txtArrays 用于处理一个文件并读取另一个文件的AWK脚本,arrays,awk,Arrays,Awk,我已经编写了一个AWK脚本来处理一个文本文件,现在需要扩展它,以便处理的输出根据第一个文件中的字段从另一个文件获取数据。这里有一个例子来说明我的意思 File1.txt abc123~17~yy~12345678 abc456~12~yy~23456789 abc789~34~zz~12345678 File2.txt abc123~11~22~33~ABC-57 abc456~22~11~33~ABC-99 abc789~33~22~11~ABC-12 我当前的awk脚本提取并处理File
abc123~17~yy~12345678
abc456~12~yy~23456789
abc789~34~zz~12345678
File2.txt
abc123~11~22~33~ABC-57
abc456~22~11~33~ABC-99
abc789~33~22~11~ABC-12
我当前的awk脚本提取并处理File1.txt中的每一行,该文件的第四个字段是“12345678”,因此它会找到两行
我现在想扩展这个,从我找到的线,比如
abc123~xx~yy~12345678
我们获取abc123并在File2.txt中搜索它,同时打印该行的第四个字段
例如。
我的awk脚本将在File1.txt的字段4中搜索令牌,然后用字段1打印该令牌,并用File2.txt的字段4打印与File1.txt中字段1相关的行
因此,如果我们搜索12345678,我的输出将是
12345678 abc123 ABC-57 17
12345678 abc789 ABC-12 34
(17和34来自File1.txt中的字段2)
总之,在File1.txt的字段4中搜索字符串,在File2.txt中找到一行,其中File1.txt中的字段1与File1.txt中的字段1匹配。然后打印
File.Field4 File1.Field1 File2.Field4 File1.Field2
我希望这是清楚的
我试图在File2.txt中搜索'abc123'字符串,然后选择第四个字段。这似乎不起作用,现在我认为在字段1上建立索引并存储字段4的File2.txt的AWK数组可能会起作用
不过我不知道该怎么做
(注意,这是我想做的事情的一个简单示例,我的实际需求文件中有更多数据)。这一行就可以做到:
$ awk -F'~' -v s='12345678' 'FNR==NR&&$4==s{a[$1];next}($1 in a){print s,$1,$5}' file1 file2
12345678 abc123 ABC-57
12345678 abc789 ABC-12
说明:
我们使用-F
选项将字段分隔符设置为~
,并使用-v
选项将变量s
的值设置为要匹配的字符串
作为带有一些解释性注释的脚本:
BEGIN { FS="~" } # Set the field separator.
FNR==NR && $4==s { # If we are in the first file and fourth field equals s
a[$1] # Create index of field one
next # Skip to next line
}
($1 in a) { # If field one in file2 is in index
print v,$1,$5 # Print v, field 1 and field 5
}
您可以像
awk-v'12345678'-f script.awk file1 file2
这样运行此命令,这一行程序将实现以下功能:
$ awk -F'~' -v s='12345678' 'FNR==NR&&$4==s{a[$1];next}($1 in a){print s,$1,$5}' file1 file2
12345678 abc123 ABC-57
12345678 abc789 ABC-12
说明:
我们使用-F
选项将字段分隔符设置为~
,并使用-v
选项将变量s
的值设置为要匹配的字符串
作为带有一些解释性注释的脚本:
BEGIN { FS="~" } # Set the field separator.
FNR==NR && $4==s { # If we are in the first file and fourth field equals s
a[$1] # Create index of field one
next # Skip to next line
}
($1 in a) { # If field one in file2 is in index
print v,$1,$5 # Print v, field 1 and field 5
}
您可以像运行
awk-v'12345678'-f script.awk file1 file2
这样运行,这似乎是我想要的解决方案
BEGIN { FS="~" } # Set the field separator.
FNR==NR && $4==s { # If we are in the first file and fourth field equals s
a[$1] # Create index of field one
field2[$1]=$2
next # Skip to next line
}
($1 in a) { # If field one in file2 is in index
print s,$1,$5,field2[$1] # Print v, field 1 and field 5
}
我认为这是正确的
我对解决方案的理解是这样的。首先,它在第一块代码中处理File1,我可以将所需的数据存储在数组中
然后在数组a中的$1上有条件地处理第二个代码块中的文件2。如果是,则输出数据,并从文件1访问field2数组
问题解决了,我的真正的AWK脚本工作得很好
非常感谢您的帮助。这似乎是我想要的解决方案
BEGIN { FS="~" } # Set the field separator.
FNR==NR && $4==s { # If we are in the first file and fourth field equals s
a[$1] # Create index of field one
field2[$1]=$2
next # Skip to next line
}
($1 in a) { # If field one in file2 is in index
print s,$1,$5,field2[$1] # Print v, field 1 and field 5
}
我认为这是正确的
我对解决方案的理解是这样的。首先,它在第一块代码中处理File1,我可以将所需的数据存储在数组中
然后在数组a中的$1上有条件地处理第二个代码块中的文件2。如果是,则输出数据,并从文件1访问field2数组
问题解决了,我的真正的AWK脚本工作得很好
非常感谢您的帮助。非常感谢,我已经适应了自己的具体需要,只是现在我意识到我的例子并不是我想要的。很抱歉当我打印结果时,我需要包含File1.txt中的一个额外字段,比如第二个字段($2)。现在,如果我理解了您上面所说的,在开始之后,{..}中有两组代码,第一组用于File1.txt,第二组用于File2.txt,那么在第二段代码中,我如何访问第一段代码中的数据。(这有意义吗?@Nerdio我看你已经自己弄明白了。很好。虽然没有你的帮助,sudo_O。谢谢,非常感谢。这是很好的感谢,我已经适应了我的确切需要,但我现在意识到我这里的例子并不是我想要的。很抱歉当我打印结果时,我需要包含File1.txt中的一个额外字段,比如第二个字段($2)。现在,如果我理解了您上面所说的,在开始之后,{..}中有两组代码,第一组用于File1.txt,第二组用于File2.txt,那么在第二段代码中,我如何访问第一段代码中的数据。(这有意义吗?@Nerdio我看你已经自己弄明白了。很好。没有你的帮助也不行。谢谢,非常感谢。