awk 和多个文件处理可能吗?

发布于 2024-12-21 00:50:13 字数 481 浏览 3 评论 0原文

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

文件 A 内容:

AAAAAAAAAAAA  1
BBBBBBBBBBBB  2
CCCCCCCCCCCC  3

文件 B 内容:

XXXXXXXXXXX  3
YYYYYYYYYYY  2
ZZZZZZZZZZZ  1

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

编辑:我需要将 A 第一行的 $2 (即 1)与 B 最后一行的 $2 (即 1)进行比较再次)。然后将 A 中第 2 行的 $2 与 B 的 NR-1 行中的 $2 进行比较。依此类推......

I need to process two file contents. I was wondering if we can pull it off using a single nawk statement.

File A contents:

AAAAAAAAAAAA  1
BBBBBBBBBBBB  2
CCCCCCCCCCCC  3

File B contents:

XXXXXXXXXXX  3
YYYYYYYYYYY  2
ZZZZZZZZZZZ  1

I would like to compare if $2 (2nd field ) in file A is the reverse of $2 in file B.
I was wondering how to write rules in nawk for multi-file processing ?
How would we distinguish A's $2 from B's $2

EDIT: I need to compare $2 of A's first line (which is 1) with the $2 of B's last line (which is 1 again) .Then compare $2 of line 2 in A with $2 in NR-1 th line of B. And so on.....

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

作妖 2024-12-28 00:50:13

你可以这样做 -

[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

You can do something like this -

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

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

Solution:

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
撩人痒 2024-12-28 00:50:13

您可以使 awk 串行处理文件,但不能轻松地使其并行处理两个文件。您可能可以通过仔细使用 getline 来实现此效果,但“小心”是最重要的术语。

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

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

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

如果您的输入更复杂,那么这可能不起作用很好,尽管您可以使用 paste -d'|' 选择分隔两个文件中的数据的字符... 使用管道分隔两条记录,以及 awk -F'|' '{ ... }'$1 读取为文件 A 中的信息,将 $2 读取为文件 B 中的信息。

You can make awk process files serially, but you can't easily make it process two files in parallel. You probably can achieve the effect with careful use of getline but 'careful' is the operative term.

I think in this case, with simple two-column files, I'd be inclined to use:

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

You would need to make sure the two files are in the appropriate order, etc.

If your input is more complex, then this may not work so well, though you can choose the character that separates the data from the two files with paste -d'|' ... to use a pipe to separate the two records, and awk -F'|' '{ ... }' to read $1 as the info from File A and $2 as the info from File B.

故事↓在人 2024-12-28 00:50:13

您是否考虑过做以下这样的事情?

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

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

Have you thought about doing something like the following?

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

tac reverses the lines of file B and then you can compare the two columns.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文