【问题标题】:Compare Txt Files in Linux and Return Elements in File 1 for Elements in File 2比较 Linux 中的文本文件并返回文件 1 中的元素与文件 2 中的元素
【发布时间】:2011-05-17 00:39:55
【问题描述】:

这就是问题所在。

  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 的 Hostnames 和 Ip 如下(HostandIP 有 hostname,IP Address 注意逗号 (,)):

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 只有 Host.txt 和 HostandIp.txt 的公共 IP,如下所示:
170.16.75.101 170.26.114.242 170.26.108.224 170.26.108.95

可以使用 HASH MAP 在 JAVA 中完成。是否有 Linux 命令可以执行此操作?请帮忙!

【问题讨论】:

  • 用 Java 编写的代码几乎不到 10 行。你为什么不想用 Java 来做呢?
  • 用简单的 shell 工具来做这件事可能有点牵强; Perl、Python 或 Ruby 可能都比 bash 更易于使用,而且我希望它们的启动速度都比 JVM 快——哪一个最适合您? :)
  • @sarnold,标准的 shell 工具实际上是最简单的方法 :-)。 join 直接作用于已排序的文件。

标签: linux shell command


【解决方案1】:
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

【讨论】:

  • 也可以使用进程替换来执行内联排序:join <(sort Host.txt) <(sort HosandIp.txt) ...
  • join -t, -o2.2 <(sort -t, -k1,1n Host.txt) <(sort -t, -k1,1n HosandIp.txt)
  • 这个的性能是 O(log(n)) 而最优解是 O(n)
【解决方案2】:

这是我在 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>);

【讨论】:

    【解决方案3】:
    awk -F, '
      NR == FNR {host[$1]++; next}
      ($1 in host) {print $2}
    ' Host.txt HostandIP.txt > IPOnly.txt
    

    【讨论】:

      【解决方案4】:

      我对 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)
      

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

          单行:

          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
          

          【讨论】:

          • 这个的性能是 O(n^2) 而最优解是 O(n)。
          • @AffluentOwl:我没有看到问题中的性能要求。如果没有具体的行数等,O(n²) 不必比 O(n) 慢。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-12-30
          • 1970-01-01
          相关资源
          最近更新 更多