2016-03-09 3 views
0

У меня есть два файла, и я бы хотел найти общий 1-й столбец на каждой строке и напечатать 1-й & 2-й столбец файла file1.txt и 2 столбца файла file2.txt.Печать общей строки из двух файлов - Bash

file1.txt 
A10 Unix 
A20 Windows 
B10 Network 
B20 Security 

file2.txt 
A10 RedHat 
A21 Win2008 
B11 Cisco 
B20 Loadbalancing 

Результат:

file.txt 
A10 Unix RedHat 
B20 Security Loadbalancing 

Я попытался код ниже, но не retrive правильный результат:

$ awk 'NR==FNR {a[$1]=$1; next} $1 in a {print a[$1], $0}' file1.txt file2.txt 
+1

переключатель 'a [$ 1]' и '$ 0' и порядок файлов в конце. – 123

ответ

0

Вы можете использовать следующую команду: awk

awk 'NR==FNR{a[$1]=$2} NR>FNR && $1 in a{print $1,a[$1],$2}' file1.txt file2.txt 

Лучше объясните d в многострочных версиях:

# Number of record is equal to number of record in file. 
# True as long as we are reading file1 
NR==FNR { 
    # Stored $2 in an assoc array index with $1 
    a[$1]=$2 
} 

# Once we are reading file2 and $1 exists in array a 
NR>FNR && $1 in a { 
    # print the columns of interest 
    print $1, a[$1], $2 
} 
+0

Спасибо, работа хорошо. – Aygitci

+0

Привет @ hek2mgl, можно ли выполнить ту же операцию с файлами с колонками, разделенными символом ';' ? Спасибо. – Aygitci

+0

Что вы имеете в виду? Вход ограничивается символом ';' или желаемым выходом? или оба? – hek2mgl

1
$ awk 'NR==FNR{a[$1]=$2;next} $1 in a{print $0, a[$1]}' file2 file1 
A10 Unix RedHat 
B20 Security Loadbalancing 
+0

Привет Эд, спасибо для ответа. В этом небольшом примере ваше решение работает отлично. Однако у меня есть только 2 столбца файла 2, и некоторые результаты усечены. – Aygitci

+1

Тогда ваш входной файл не такой, как вы показали нам, поэтому отредактируйте свой вопрос, чтобы обеспечить более точный репрезентативный ввод/вывод. Также проверьте свой файл для control-Ms, как вы найдете в файлах, созданных в Windows, - используйте 'cat -v', чтобы увидеть их и' dos2unix' или аналогичные, чтобы удалить их. –

+0

Точный, я конвертирую файл в формат Unix и снова тестирую, но я получил меньше результата. Команда, предоставляемая @ hek2mgl, работает лучше. Спасибо за вашу помощь. – Aygitci

2

это стандартный случай использования для join, для файлов в отсортированном порядке уже. Нет необходимости в дополнительном коде.

$ join file1 file2 

A10 Unix RedHat 
B20 Security Loadbalancing 
+0

Действительно, хороший момент! – hek2mgl

Смежные вопросы