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

4

This question already has an answer here:

Inner join on two text files 5 answers

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

Первый файл такой

<code>man01 xxx yyy zzz
man02 xxx yyy zzz
man03 xxx yyy zzz
man04 xxx yyy zzz
</code>

Второй файл

<code>man01 sss
man08 sss
</code>

И желаемый результат

<code>man01 xxx yyy zzz sss
man02 xxx yyy zzz
man03 xxx yyy zzz
man04 xxx yyy zzz
</code>

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

У меня не так много времени, ноcomm а такжеpaste может пригодится, прочитайте ихman страницы c00kiemon5ter
Выглядит как хорошая работа для Perl, не так ли? (Если кто-то может придумать разумный способ решить эту проблему с помощью основных инструментов, я буду впечатлен!) thb
нет ждать, это работа дляjoin :) c00kiemon5ter
нет нет пустых строк! Gregory Maris
У вас есть пустая строка между записями? kev

Ваш Ответ

2   ответа
15

Присоединиться может сделать это, вы рассмотрели-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
Error: User Rate Limit Exceeded Gregory Maris
Error: User Rate Limit Exceeded
0

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

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"; }'

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

Похожие вопросы