用awk比较文件

时间:2013-02-25 11:22:26

标签: awk comparison compare two-columns

您好我有两个相似的文件(都有3列)。我想检查这两个文件是否包含相同的元素(但以不同的顺序列出)。首先,我想仅比较第1列

file1.txt

"aba" 0 0 
"abc" 0 1
"abd" 1 1 
"xxx" 0 0

FILE2.TXT

"xyz" 0 0
"aba" 0 0
"xxx" 0 0
"abc" 1 1

如何使用awk进行操作?我试着环顾四周,但我发现只有复杂的例子。如果我想在比较中包含其他两列,该怎么办?输出应该给我匹配元素的数量。

2 个答案:

答案 0 :(得分:26)

在两个文件中打印常见的元素

$ awk 'NR==FNR{a[$1];next}$1 in a{print $1}' file1 file2
"aba"
"abc"
"xxx"

说明:

NRFNRawk变量,分别存储记录总数和当前文件中的记录数(默认记录是一行)。

NR==FNR # Only true when in the first file 
{
    a[$1] # Build associative array on the first column of the file
    next  # Skip all proceeding blocks and process next line
}
($1 in a) # Check in the value in column one of the second files is in the array
{
    # If so print it
    print $1
}

如果您想匹配整行,请使用$0

$ awk 'NR==FNR{a[$0];next}$0 in a{print $0}' file1 file2
"aba" 0 0
"xxx" 0 0

或一组特定的列:

$ awk 'NR==FNR{a[$1,$2,$3];next}($1,$2,$3) in a{print $1,$2,$3}' file1 file2
"aba" 0 0
"xxx" 0 0

答案 1 :(得分:6)

要打印匹配元素的数量,这是使用awk的一种方式:

awk 'FNR==NR { a[$1]; next } $1 in a { c++ } END { print c }' file1.txt file2.txt

使用您的输入结果:

3

如果您想添加额外的列(例如,第一列,第二列和第三列),请使用pseudo-multidimensional array

awk 'FNR==NR { a[$1,$2,$3]; next } ($1,$2,$3) in a { c++ } END { print c }' file1.txt file2.txt

使用您的输入结果:

2