2011-05-17 80 views
1

這是問題所在。比較Linux中的Txt文件和文件2中元素的返回元素

  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 

我需要比較這兩個文件,並在名爲IPOnly.txt

另一個文本文件只獲取IP地址
  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中使用哈希表來完成。有沒有一個Linux命令來做到這一點?請幫忙!

+0

差不多不到10行的代碼。你爲什麼不想用Java來做呢? – 2011-05-17 00:46:50

+0

使用簡單的外殼工具來做這件事可能有點難度; Perl,Python或Ruby可能比'bash'更容易使用,我希望它們的啓動速度都比JVM快 - 哪一個最適合你? :) – sarnold 2011-05-17 00:47:30

+0

@sarnold,標準shell工具實際上是最簡單的方法:-)。 'join'直接處理排序後的文件。 – 2011-05-17 01:04:58

回答

-1

單行:

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 
+0

請評論downvote。我需要糾正一些事情嗎? – 2011-05-18 14:29:36

+0

這個性能是O(n^2),而最優解是O(n)。 – AffluentOwl 2013-08-29 05:07:38

+0

@AffluentOwl:我沒有看到問題中的性能要求。沒有具體的行數等等,O(n2)不需要比O(n)慢。 – 2013-08-29 22:34:47

3
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的呼叫來完成此操作。 Join man page

+0

也可以使用進程替換來執行內聯排序:'join <(sort Host.txt)<(sort HosandIp.txt)...' – 2011-05-17 02:29:10

+1

'join -t,-o2.2 <(sort -t,-k1 ,1n Host.txt)<(sort -t,-k1,1n HosandIp.txt)' – pixelbeat 2011-05-17 10:05:52

+0

這個性能是O(log(n)),最優解是O(n) – AffluentOwl 2014-03-06 00:48:46

0

這是我在Perl 0.02 $

#!/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
awk -F, ' 
    NR == FNR {host[$1]++; next} 
    ($1 in host) {print $2} 
' Host.txt HostandIP.txt > IPOnly.txt 
0

我使用Python看法:在Java中

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

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