2016-02-24 3 views
0

У меня есть два файла input1.txt и input2.txt.соответствует строке в файле и печатает следующий столбец

input1.txt имеет следующие детали:

abcd.net 
bcad.net 
cagh.net 
degh.net 
usna.net 

input2.txt имеет следующие детали:

abcd.net 169.254.0.2 
bcad.net 169.254.0.3 
cagh.net 169.254.0.4 
us-1212-qwe.net 169.254.232.50 
us-cisco.net 10.120.2.3 
degh.net 169.254.0.5 
usna.net 169.254.0.6 
ab1234.net 169.254.0.7 
catorr.net 169.254.0.8 

мне нужно получить соответствующую IP деталь серверов, перечисленных в разделе "input1.txt" из файла "input2.txt"

Вывод должен быть таким:

abcd.net 169.254.0.2 
bcad.net 169.254.0.3 
cagh.net 169.254.0.4 
degh.net 169.254.0.5 
usna.net 169.254.0.6 

Мой код, как показано ниже, работает неправильно. Пожалуйста помоги.

for i in `cat input1.txt`; do more input2.txt | grep -w "^$i"; done 
+0

Каждых время, когда вы пишете цикл в оболочке, просто для управления текстом у вас неправильный подход. См. Http://unix.stackexchange.com/questions/169716/why-is-using-a-shell-loop-to-process-text-considered-bad-practice. –

ответ

2
awk 'FNR==NR{ip[$1]=$2} FNR!= NR {print $1, ip[$1]}' input2.txt input1.txt 

Это читает input2.txt и строит массив требуемых данных, индексированный посредством первого столбца. Затем он считывает intput1.txt и для каждой строки печатает хост плюс данные в массиве.

Примечание. Ответ на этот вопрос больше не применяется, поскольку вопрос был отредактирован. Для отредактированного вопроса вы можете сделать:

awk 'FNR==NR{ip[$1".net"]=$2} FNR!= NR {print $1, ip[$1]}' input2.txt input1.txt 

но это не лучшее общее решение. (Например, жестко прописывать текст ".net" страшный подход, но для быстрого взлома это хорошо.)

+0

Можете ли вы объяснить, как это работает, пожалуйста.? – user3834663

+2

Или удалить void, затем сбрасывая условие: 'FNR == NR {ip [$ 1] = $ 2; next} {print $ 1, ip [$ 1]}'. @ user3834663 это абсолютно базовый awk - прочитайте первую пару глав эффективного программирования Awk, 4-е издание, Арнольда Роббинса, чтобы понять этот скрипт, а затем завершить чтение, прежде чем пытаться больше программировать оболочку. –

+0

Аналогичным образом, если input1.txt имеет только краткое имя, как показано ниже. Как я должен соответствовать? abcd bcad cagh degh usna – user3834663

1

альтернативы awk

join <(sort input1) <(sort input2) 

abcd.net 169.254.0.2 
bcad.net 169.254.0.3 
cagh.net 169.254.0.4 
degh.net 169.254.0.5 
usna.net 169.254.0.6 

или старого доброго Grep

grep -f input1 input2 

abcd.net 169.254.0.2 
bcad.net 169.254.0.3 
cagh.net 169.254.0.4 
degh.net 169.254.0.5 
usna.net 169.254.0.6 
Смежные вопросы