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