awk 来比较两个文件



我正在尝试比较两个文件并想打印匹配的行...文件中存在的行将是唯一的

文件1.txt

GERMANY
FRANCE
UK
POLLAND

文件2.txt

POLLAND 
GERMANY

我尝试使用以下命令

awk 'BEGIN { FS="n" } ; NR==FNR{A[$1]++;NEXT}A[$1]' File1.txt File2.txt

但是它正在打印两次匹配记录,我希望它们打印一次...

更新

预期产出

POLLAND 
GERMANY

电流输出

POLLAND 
GERMANY
POLLAND 
GERMANY

grep-f(对于文件)一起最适合:

$ grep -f f1 f2
POLLAND 
GERMANY

实际上,要获得完全匹配且没有正则表达式,请分别使用 -w-F

$ grep -wFf f1 f2
POLLAND 
GERMANY

如果你真的必须用 awk ,那么你可以使用:

$ 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是一个空格,这样是可以的。将其设置为新行会使其行为不端。

你的命令应该是:

awk 'NR==FNR{A[$1]++;next}A[$1]' file1 file2

您在 BEGIN{} 的右大括号后有一个杂散的分号,并且还有大写字母的"NEXT",并且拼写错误的文件名。

试试这个单行:

awk 'NR==FNR{name[$1]++;next}$1 in name' file1.txt file2.txt
  • 循环访问第一个文件NR==FNR将名称存储在名为 names 的数组中。
  • 您可以使用 next 来防止第二个操作在第一个文件完全存储在数组中之前出现。
  • 第一个文件完成后,通过检查数组中是否存在下一个文件来启动下一个文件。如果退出,它将打印出名称。
  • FS是字段分隔符。您无需将其设置为 new line .您需要RS Record Separator新行。但我们在这里不这样做,因为它是默认值。

如果你不必使用 awk,一个更好的选择可能是 GNU coreutil,comm 。从手册页:

comm -12 file1 file2 Print only lines present in both file1 and file2.

相关内容

  • 没有找到相关文章

最新更新