AWK脚本处理一个文件并读取另一个文件

时间:2013-04-15 13:59:00

标签: 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脚本从第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数组可能会这样做。

我不知道怎么回事。

(注意,这是我要做的事情的一个简化示例,我的真实需求在文件中有更多数据)。

2 个答案:

答案 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脚本就是一种享受。

非常感谢你的帮助。