1

我编写了一个 AWK 脚本来处理文本文件,现在需要扩展它,以便处理的输出根据第一个文件中的字段从另一个文件中获取数据。这是我的意思的一个例子;

文件1.txt

abc123~17~yy~12345678
abc456~12~yy~23456789
abc789~34~zz~12345678

文件2.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 个字段。

例如。我的 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 的 Field 4 中搜索字符串,在 File2.txt 中找到 File1.txt 中的 Field 1 与 File1.txt 中的 Field 1 匹配的行。然后打印

文件. 字段 4 文件 1. 字段 1 文件 2. 字段 4 文件 1. 字段 2

我希望这很清楚。

我尝试在 File2.txt 中查找“abc123”字符串,然后选择第 4 个字段。这似乎不起作用,现在我认为在字段 1 上建立索引并存储字段 4 的 File2.txt 的 AWK 数组可能会做到这一点。

我不知道该怎么做。

(注意,这是我想要做的一个精简的例子,我真正的要求是文件中有更多的数据)。

4

2 回答 2

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

于 2013-04-15T14:06:36.403 回答
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,条件是 $1 在数组 a 中。如果是,则输出数据,并从文件 1 中访问 field2 数组。

问题解决了,我真正的 AWK 脚本很有效。

非常感谢您的帮助。

于 2013-04-15T15:01:38.710 回答