【问题标题】:Is Awk and multiple file processing possible?是否可以进行 awk 和多文件处理?
【发布时间】:2012-01-19 23:59:25
【问题描述】:

我需要处理两个文件内容。我想知道我们是否可以使用单个 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 的第一行(即 1)的 $2 与 B 的最后一行(再次为 1)的 $2 进行比较。然后将 A 中第 2 行的 $2 与 NR-1 中的 $2 进行比较B. 等等......

【问题讨论】:

  • 请编辑您的数据,以便至少有一行的 $2 彼此相反。在给定输入的情况下,还可以编辑以显示您期望的输出。祝你好运。
  • @shelter:嗨...我需要比较 A 中第一行中的 $2 与 B 中最后一行中的 $2 .. 没有预期的输出。问题是如何进行比较(如果可能的话)
  • @shelter:我添加了一个编辑来帮助您更好地理解问题...希望这会有所帮助...谢谢

标签: unix file-io awk ksh nawk


【解决方案1】:

你可以这样做 -

[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

【讨论】:

  • Ahhh FNR !!... 这就是诀窍... Dint 知道它到底是做什么用的... 谢谢你
  • 不客气。 :) 是的,当您必须处理多个文件时,FNR 会派上用场。 FNRNR 类似,它存储记录号,但与 NR 不同,它在文件被完全读取后重置为 0。所以NR===FNR 限制了对一个文件的特定操作,这样我们就可以为第二个文件添加更多操作。
  • Gotcha...并且使用“下一步”,只要我们正在处理文件 A,您就一直确保始终满足“NR==FNR”条件。这是一个深思熟虑的解决方案。荣誉
  • 您可以将该代码缩短为awk 'NR==NFR{a[i++]=$2;next}a[--i]==$2{print "Match",a[i],a[i];next}{print "Do Not Match",a[i],$2}' f1 f2
  • 这会将文件内容读入内存吗?如果是这样,有没有办法在不将文件内容读入内存的情况下做到这一点?
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    您可以使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 中的信息。

    【讨论】:

    • 使用解释器和串行编程有点难以掌握,因为我习惯于处理 C。我们只需要两个指针,我们一直在仪式偏移处进行比较......谢谢你的选择:)
    猜你喜欢
    • 1970-01-01
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    • 2017-11-28
    • 2019-03-23
    • 2013-04-12
    • 2014-08-24
    • 2020-11-21
    相关资源
    最近更新 更多