сравнение двух несортированных файлов - PullRequest
7 голосов
/ 14 июля 2011

У меня есть два файла, разделенных табуляцией (см. Примеры ниже):

Файл 1

Java    RAJ
PERL    ALEX
PYTHON  MAurice

(и т. Д.)

Файл 2

ALEX    3.4
SAM     8.9
PEPPER  9.0

Теперь, если, например, ALEX также найден в файле 2 (не обязательно, что ALEX будет найден), у меня должен быть третий файл, похожий на этот:

PERL ALEX 3.4

Код должен проверять все значения в столбце 2 файла 1 в файле 2.

Есть предложения для скрипта bash?

Ответы [ 4 ]

6 голосов
/ 14 июля 2011

Вы хотите использовать join для этого.Сначала вам нужно отсортировать по полю соединения:

join -1 2 -2 1 <(sort +1 -2 file1) <(sort +0 -1 file2)
5 голосов
/ 14 июля 2011
awk 'NR==FNR {val[$1]=$2; next} $2 in val {print $0, val[$2]}' file2 file1
1 голос
/ 15 июля 2011

Вы получили отличные ответы, используя join и awk , так что я подумал, что я публикую чистый bash-one:

#!/bin/bash

declare -A name2prog
declare -A name2num

while read a b; do name2prog[$b]=$a; done < file1
while read a b; do name2num[$a]=$b; done < file2

for i in "${!name2num[@]}"
do
    if  [[ ${name2prog[$i]} ]]; then
        echo ${name2prog[$i]} $i ${name2num[$i]}
    fi
done

output:

$ ./try.sh
PERL ALEX 3.4
1 голос
/ 14 июля 2011

Однострочник с PERL тоже хорошо?Работает без сортировки .. Предполагая, что ваши файлы называются f1 и f2 ..

perl -e 'open(F1, shift); open(F2, shift); $ls = $/;undef $/;$f2 = <F2>;$/ = $ls; while(<F1>) { ($t1, $t2) = $_ =~ /^(\w+)\s+(\w+)$/; if($t1) { ($t3) = $f2 =~ /^$t2\s+(.+)$/m; print "$t1 $t2 $t3 \n" if ($t3); } }' f1 f2

С f1:

Java RAJ

PERL ALEX

PYTHON Maurice

И f2:

ALEX 3.4
SAM 8.9
PEPPER 9.0

Результаты в:

PERL ALEX 3.4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...