2015-01-23 5 views
-1

скажем, у меня есть два файла данных, которые могут выглядеть так.Сравнение двух разных файлов

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 

Но даже выводить только те, которые вместе с его значением, которые являются общими в обоих файлах достаточно хорошо для меня. Благодарю.

+1

Что такое 'A' и' B'? Являются ли они строками, не содержащими пробел? Фиксированная ширина или переменная? – lurker

+0

Это лишь некоторые другие значения, измеренные как часть эксперимента, но они не имеют большого значения в моем анализе. Нет пробела, но не фиксированной ширины. – Gavin

+0

Это звучит как домашний вопрос :) –

ответ

0

Я не уверен, почему это вопрос linux/unix. Похоже, что вам нужна простая программа, которую вам нужно написать, поскольку это не основная проблема с двумя файлами, которая обычно покрывается такими приложениями, как Beyond Compare.

Предположим, что эти файлы являются основными текстовыми файлами, которые содержат одну запись на строку с разделителями-разделителями. (Используйте пробел, поскольку разделитель опасен, но это то, что у вас есть выше). Вам нужно будет прочитать в каждом файле, сохранив оба файла в виде [итерируемой коллекции], и каждый объект будет либо строкой, в которой вы действуете в каждом цикле цикла, либо разбиваете на куски по мере создания из файла , Вам нужно будет сравнить [linepart 1] с первым файлом с каждым [linepart 1] во втором файле и всякий раз, когда вы найдете совпадение, break и output [linepart 1] [A.linepart 2] [B.linepart 2 ].

Я не могу думать о любой существующей программе, которая будет делать это для вас, но это довольно просто (если вы думаете, файл ввод-вывод просто) для обработки с Java, C# и т.д.

1

это один-лайнер должен:

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

@Kent сделал серьезную магию одной линии. Во всяком случае, я сделал сценарий оболочки, который вы могли бы попробовать. Просто запустить ./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 
Смежные вопросы