我正在尝试比较两个文件,并希望打印匹配的行...文件中的行将是唯一的
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
答案 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.