Сравните TXT-файлы в Linux и верните элементы в файле 1 для элементов в файле 2 - PullRequest
1 голос
/ 17 мая 2011

Вот проблема.

  1. Файл Host.txt имеет только следующие имена хостов:
GVC-CH-ZRH-BRA-5H81-PELE
GVC-US-NYC-9TH-4C101-MEDROOM
GVC-US-NYC-9TH-4C101E-EXTRA
GVC-US-NYC-9TH-5E117-STUDIO54

2.HosandIp.txt имеет имена хостов и Ip следующим образом (HostandIP имеет имя хоста, IP-адрес. Запятую (,)):

GVC-CH-ZRH-BRA-5H81-PELE,170.16.75.101
GVC-US-NYC-9TH-4C101-MEDROOM,170.26.114.242
GVC-US-NYC-9TH-4C101E-EXTRA,170.26.108.224
GVC-US-NYC-9TH-5E117-STUDIO54,170.26.108.95
beta-gvc-personal-antoniop-526,170.26.107.180
beta-gvc-personal-antoniop-9100,170.26.106.206
beta-gvc-personal-antoniop-9100b,170.26.106.41
beta-gvc-personal-antoniop-office,170.26.107.192

Мне нужно сравнить эти два файла и получить только IP-адрес в другом текстовом файле с именем IPOnly.txt

  1. IPOnly.txt имеет только общие IP-адреса для обоих Host.txt и HostandIp.txt следующим образом:
170.16.75.101
170.26.114.242
170.26.108.224
170.26.108.95

Это можно сделать в JAVA, используя HASH MAP. Есть ли команда Linux для этого? Пожалуйста, помогите!

Ответы [ 6 ]

3 голосов
/ 17 мая 2011
sort Host.txt -o Host_sorted.txt
sort HosandIp.txt -o HosandIp_sorted.txt
join Host_sorted.txt HosandIp_sorted.txt -t, | cut -d, -f2

Входные файлы должны быть отсортированы. Записи не совсем отсортированы в порядке, желаемом join, поэтому я включил вызовы sort для этого. Присоединиться к справочной странице

0 голосов
/ 29 августа 2013

sed -e 's/^/\^/' -e 's/$/,/' Host.txt | egrep -f - HosandIp.txt | awk -F, '{print $2}' > IPOnly.txt

0 голосов
/ 29 августа 2013

Мой дубль с использованием Python:

hosts_contents = open('Host.txt', 'r').read()
hosts_and_ips_contents = open('HosandIp.txt', 'r').read()
host_ips = dict(line.split(',') for line in hosts_and_ips_contents.splitlines())
hosts_wanted = set(hosts_contents.splitlines())
print '\n'.join(ip for host, ip in host_ips.iteritems() if host in hosts_wanted)
0 голосов
/ 17 мая 2011
awk -F, '
  NR == FNR {host[$1]++; next}
  ($1 in host) {print $2}
' Host.txt HostandIP.txt > IPOnly.txt
0 голосов
/ 17 мая 2011

Вот мои 0,02 $ в perl

#!/usr/bin/perl
use strict;
use warnings;

open (HOST, '<Host.txt') || die;
open (HOSTANDIP, '<HostAndIp.txt') || die;

my %host2ip;
map { chomp; my ($h,$i) = split /,/; $host2ip{$h} = $i } (<HOSTANDIP>);

map { chomp; print "$host2ip{$_}\n" if exists($host2ip{$_}) } (<HOST>);
0 голосов
/ 17 мая 2011

однострочник:

for line in $(cat host.txt); do sed -n s/$line',\(.*\)/\1/p' host-and-ip.txt ; done > ip-only.txt

в читаемом виде:

for line in $(cat host.txt)
do
  sed -n s/$line',\(.*\)/\1/p' host-and-ip.txt 
done > ipOnly.txt
...