我编写了一个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脚本从第4个字段为'12345678'的File1.txt中提取并处理每一行,因此它找到2行。
我现在想扩展这个,所以从我找到的那一行开始说,
abc123~xx~yy~12345678
我们使用abc123并在File2.txt中搜索它并打印该行的第4个字段。
EG。 我的awk脚本将在File1.txt的字段4中搜索一个令牌,然后在字段1中打印一个long,在File1.txt中打印与Field1相关的行的File2.txt的字段4
因此,如果我们要搜索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'字符串,然后选择第4个字段。这似乎不起作用,现在我认为在字段1和存储字段4上索引的File2.txt的AWK数组可能会这样做。
我不知道怎么回事。
(注意,这是我要做的事情的一个简化示例,我的真实需求在文件中有更多数据)。
答案 0 :(得分:3)
这一个班轮将起到作用:
$ 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
,并使用s
选项将变量-v
的值设置为我们要匹配的字符串。
作为一个带有一些解释性评论的脚本:
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
一样运行。
答案 1 :(得分:3)
这看起来是我想要的解决方案;
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,我可以将我想要的数据存储在数组中。
然后在第二个代码块中有条件地处理文件2,在数组a中为$ 1。如果是,则输出数据,然后从文件1访问field2数组。
问题解决了,我真正的AWK脚本就是一种享受。
非常感谢你的帮助。