Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 用于处理一个文件并读取另一个文件的AWK脚本_Arrays_Awk - Fatal编程技术网

Arrays 用于处理一个文件并读取另一个文件的AWK脚本

Arrays 用于处理一个文件并读取另一个文件的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

我已经编写了一个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脚本提取并处理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我看你已经自己弄明白了。很好。没有你的帮助也不行。谢谢,非常感谢。