首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >awk来比较两个文件

awk来比较两个文件
EN

Stack Overflow用户
提问于 2014-02-28 16:20:01
回答 4查看 39.6K关注 0票数 5

我试着比较两个文件,并想打印匹配的线条.文件中的行将是唯一的。

File1.txt

代码语言:javascript
运行
复制
GERMANY
FRANCE
UK
POLLAND

File2.txt

代码语言:javascript
运行
复制
POLLAND 
GERMANY

我试着用以下命令

代码语言:javascript
运行
复制
awk 'BEGIN { FS="\n" } ; NR==FNR{A[$1]++;NEXT}A[$1]' File1.txt File2.txt

但是它打印了两次匹配的记录,我想把它们打印一次.

更新

预期产出

代码语言:javascript
运行
复制
POLLAND 
GERMANY

电流输出

代码语言:javascript
运行
复制
POLLAND 
GERMANY
POLLAND 
GERMANY
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-02-28 16:22:46

grep-f (用于文件)对此最好:

代码语言:javascript
运行
复制
$ grep -f f1 f2
POLLAND 
GERMANY

实际上,要获得精确匹配和不使用正则表达式,分别使用-w-F

代码语言:javascript
运行
复制
$ grep -wFf f1 f2
POLLAND 
GERMANY

如果您真的必须用awk来完成它,那么您可以使用:

代码语言:javascript
运行
复制
$ awk 'FNR==NR {a[$1]; next} $1 in a' f1 f2
POLLAND 
GERMANY
  • 读取第一个文件时执行FNR==NR
  • {a[$1]; next}将第一个文件的行存储在a[]中,然后转到下一行。
  • 当循环遍历第二个文件时对$1 in a进行评估。它检查当前行是否在a[]数组中。

为什么你的剧本不起作用?

  • 因为您使用的是NEXT而不是next。因此,它被视为常量而不是命令。
  • 另外,因为BEGIN { FS="\n" }是错误的,因为默认的FS是一个空格,所以可以这样做。把它设为一条新的路线,使它行为不端。
票数 19
EN

Stack Overflow用户

发布于 2014-02-28 16:25:45

你的命令应该是:

代码语言:javascript
运行
复制
awk 'NR==FNR{A[$1]++;next}A[$1]' file1 file2

在BEGIN{}的大括号后面有一个偏离的分号,还有大写字母中的"NEXT“,并且拼写错误。

票数 2
EN

Stack Overflow用户

发布于 2014-02-28 16:30:26

试试看这个衬里:

代码语言:javascript
运行
复制
awk 'NR==FNR{name[$1]++;next}$1 in name' file1.txt file2.txt
  • 迭代第一个文件NR==FNR,将名称存储在一个名为names的数组中。
  • 您可以使用next来防止第二个操作发生,直到第一个文件完全存储在数组中为止。
  • 第一个文件完成后,可以通过检查下一个文件是否存在于数组中来启动下一个文件。如果它退出,它将打印出名称。
  • FS是字段分隔符。您不需要将其设置为new line。您需要RS,它是Record Separator,才是新的行。但我们在这里不这么做,因为它是默认值。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22100384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档