объединить два файла по ключу, если он существует в первом скрипте file / bash [duplicate]

На этот вопрос уже есть ответ:

Внутреннее объединение двух текстовых файлов 5 ответов

меня есть два файла со столбцами, отсортированными по значению первого столбца, и я хочу объединить их, только если значение первого существует в первом.

Первый файл похож на это

man01 xxx yyy zzz
man02 xxx yyy zzz
man03 xxx yyy zzz
man04 xxx yyy zzz

Второй файл

man01 sss
man08 sss

И желаемый вывод

man01 xxx yyy zzz sss
man02 xxx yyy zzz
man03 xxx yyy zzz
man04 xxx yyy zzz

Я пытался соединиться, но требует, чтобы значения второго файла существовали в первом: /

 thb28 апр. 2012 г., 16:40
Выглядит как хорошая работа для Perl, не так ли? (Если кто-нибудь может придумать разумный способ решить эту проблему с помощью основных инструментов, я буду впечатлен!)
 kev28 апр. 2012 г., 16:39
У тебя есть пустая строка между записями?
 c00kiemon5ter28 апр. 2012 г., 16:41
У меня мало времени, ноcomm а такжеpaste может пригодится, читай ихman страницы
 c00kiemon5ter28 апр. 2012 г., 16:42
не подожди, это работа дляjoin:)
 Gregory Maris28 апр. 2012 г., 16:42
нет пустых строк!

Ответы на вопрос(2)

Решение Вопроса

Join может сделать это, вы рассмотрели-a вариант? Он создаст строку для каждой невыполняемой строки файла в a.txt и b.txt.

join -a1 a.txt b.txt

man01 xxx yyy zzz sss
man02 xxx yyy zzz
man03 xxx yyy zzz
man04 xxx yyy zzz
 kev28 апр. 2012 г., 16:46
идеальное решение.
 Gregory Maris28 апр. 2012 г., 17:10
Вау! Yeap! это сделал это! : D спасибо !!

это не красота элегантного использования командной строки, но как насчет этого?

perl -we 'open F1, "<file1.txt"; open F2, "<file2.txt"; my %f2 = map {/(\S+)/ ? ($1=>$_) : ()} <F2>; while (<F1>) { chomp; print; if (/(\S+)/ && exists $f2{$1}) { $f2{$1} =~ /\S+\s+(.*)/ and print " $1"; } print "\n"; }'

Обновить Пока я работал над этим, кажется, что @bunting и @ c00kiemon5ter придумали гораздо более элегантный ответ. Превосходно

Ваш ответ на вопрос