5

我需要处理两个文件内容。我想知道我们是否可以使用单个 nawk 语句来完成它。

文件A内容:

AAAAAAAAAAAA  1
BBBBBBBBBBBB  2
CCCCCCCCCCCC  3

文件B内容:

XXXXXXXXXXX  3
YYYYYYYYYYY  2
ZZZZZZZZZZZ  1

我想比较$2文件 A 中的(第二个字段)是否与文件 B 中的相反$2。我想知道如何在 nawk 中编写规则以进行多文件处理?我们如何区分A$2和B$2

编辑:我需要将 A 的第一行的 2 美元(即 1)与 B 的最后一行的 2 美元(再次为 1)进行比较。然后将 A 中第 2 行的 2 美元与 B 的 NR-1 行中的 2 美元进行比较。很快.....

4

3 回答 3

6

你可以做这样的事情 -

[jaypal:~/Temp] cat f1
AAAAAAAAAAAA  1
BBBBBBBBBBBB  2
CCCCCCCCCCCC  3
DDDDDDDDDDDD  4

[jaypal:~/Temp] cat f2
AAAAAAAAAAA  5
XXXXXXXXXXX  3
YYYYYYYYYYY  2
ZZZZZZZZZZZ  1

解决方案:

awk '
NR==FNR {a[i++]=$2; next}
{print (a[--i] == $2 ? "Match " $2 FS a[i] : "Do not match " $2 FS a[i])}' FileB FileA
Match 1 1
Match 2 2
Match 3 3
Do not match 4 5
于 2011-12-15T02:08:51.270 回答
6

您可以awk串行处理文件,但不能轻松地使其并行处理两个文件。您可能可以通过仔细使用来达到效果,getline但“小心”是操作术语。

我认为在这种情况下,对于简单的两列文件,我倾向于使用:

paste "File A" "File B" |
awk '{ process fields $1, $2 from File A and fields $3, $4 from file B }'

您需要确保这两个文件的顺序正确,等等。

如果您的输入更复杂,那么这可能效果不佳,尽管您可以选择将数据与两个文件分开的字符,paste -d'|' ...以使用管道分隔两个记录,并从文件 Aawk -F'|' '{ ... }'中读取信息和作为文件 B 中的信息。$1$2

于 2011-12-15T05:39:16.697 回答
0

您是否考虑过执行以下操作?

diff --brief <(awk '{print $2}' A) <(tac B | awk '{print $2}')

tac反转文件 B 的行,然后您可以比较两列。

于 2011-12-15T02:10:52.983 回答