比较两个不同的文件

时间:2015-01-23 16:19:21

标签: linux shell unix

说我有两个看起来像这样的数据文件。

A dog 3
A cat 1
A mouse 4
A chicken 4

B tiger 2
B chicken 1
B dog 3
B wolf 2

我怎样才能只查看两个文件中常见的动物?理想情况下,我希望输出看起来像

dog 3 3
chicken 4 1

但即使输出两个文件中常见的值及其值也足够了。感谢。

3 个答案:

答案 0 :(得分:1)

这个单行应该做:

awk 'NR==FNR{a[$2]=$2 FS $3;next}a[$2]{print a[$2],$3}' f1 f2 

答案 1 :(得分:1)

@Kent做了一些严肃的一线魔法。无论如何,我做了一个你可以尝试的shell脚本。只需运行./script[file1] [file2]

即可
#!/bin/bash

# Read input
words1=$(cat $1 | sed -r "s/.*\ (.*)\ .*/\1/")
val1=$(cat $1 | sed -r "s/.*\ .*\ (.*)/\1/")
words2=$(cat $2 | sed -r "s/.*\ (.*)\ .*/\1/")
val2=$(cat $2 | sed -r "s/.*\ .*\ (.*)/\1/")

# Convert to array 
words1=($words1)
val1=($val1)
words2=($words2)
val2=($val2)

# Iterate and print result
for i in "${!words1[@]}"; do
    for j in "${!words2[@]}"; do
        if [ ${words1[i]} == ${words2[j]} ]; then
            echo "${words1[i]} ${val1[i]} ${val2[j]}"
            break
        fi
    done
done

exit 0

答案 2 :(得分:0)

我不确定为什么这是linux / unix问题。看起来你需要的是一个你需要编写的简单程序,因为这不是一个基本的比较双文件问题,通常会被Beyond Compare等应用程序所覆盖。

假设这些文件是基本文本文件,每行包含一个带空格分隔值的记录。 (使用空格作为分隔符很危险,但这就是你上面的内容)。您需要读入每个文件,将这两个文件存储为[可迭代集合],并让每个对象成为您在循环的每次运行中执行的字符串,或者在从文件构建时分成几个部分。您需要将第一个文件中的[linepart 1]与第二个文件中的每个[linepart 1]进行比较,每当找到匹配项时,断开并输出[linepart 1] [A.linepart 2] [B.linepart 2 ]

我想不出任何可以为你做这个的现有程序,但它很简单(假设你认为文件IO很简单)来处理Java,C#等。