awk比较两个文件

时间:2014-02-28 16:20:02

标签: bash shell awk

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

FILE1.TXT

GERMANY
FRANCE
UK
POLLAND

FILE2.TXT

POLLAND 
GERMANY

我尝试使用以下命令

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

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

更新

预期产出

POLLAND 
GERMANY

当前输出

POLLAND 
GERMANY
POLLAND 
GERMANY

4 个答案:

答案 0 :(得分:12)

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

答案 1 :(得分:2)

你的命令应该是:

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

你在BEGIN {}的右大括号之后有一个散乱的分号,并且还有大写字母的“NEXT”并且你的文件名拼写错误。

答案 2 :(得分:2)

试试这个单行:

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

答案 3 :(得分:0)

如果你 没有使用awk,那么更好的选择可能是GNU coreutil,comm。从手册页:

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