【问题标题】:comparing 2 files and extracting elements from file比较 2 个文件并从文件中提取元素
【发布时间】:2012-09-06 20:46:18
【问题描述】:

我有两个文件。一个包含名称列表(只有一列),第二个文件包含三列名称、电话号码、国家/地区。

我想要的是提取名称不存在于文件 1 中但仅存在于文件 2 中的人的数据。

#!/bin/bash

for i in `cat file1 `
   do
      cat file2 | awk '{ if ($1 != "'$i'") {print $1 "\t" $2 "\t" $3 }}'>>NonResp
   done

我得到的是一个奇怪的结果,其中的数据比预期的要多。

请帮忙。

【问题讨论】:

  • 这和 PYthon 有什么关系?
  • 搜索了两分钟,找到了this

标签: shell awk


【解决方案1】:

您可以使用grep

grep -v -F -f file1 file2

【讨论】:

    【解决方案2】:
    awk '{print $1}' file2 | comm -1 -3 file1 - | join file2 -
    

    文件必须已经排序才能正常工作。 说明:

    => awk '{print $1}' file2 |
    

    仅打印 file2 的第一个 fileld 并将其提供给下一个命令 (|)

    => comm -1 -3 file1 - |
    

    比较 file1 和最后一个命令的输出 (-) 并仅抑制 file1 (-1) 中的行以及两个文件中的行 (-3);仅在 file2 中保留行并将其提供给下一个命令 (|)

    => join file2 -
    

    将原始文件 2 和最后一个命令 (-) 的输出连接起来,并写出匹配行的字段(但是,字段之间的空格会被截断)

    测试用例:

    猫 file1 艾伦 伯特 辛迪 戴夫 弗雷德 晴天 泰德 EOF 猫 file2 伯特 01 AU 辛迪 03 CZ 金妮 05 CN 泰德 07 CH 佐罗 09 AG EOF awk '{print $1}' 文件2 |通讯 -1 -3 文件 1 - |加入文件2 -

    【讨论】:

      【解决方案3】:

      假设file2中的字段分隔符为“,

      awk -F, 'FNR==NR{a[$1];next}!($1 in a)' file1 file2
      

      如果“,”不是分隔符,那么简单

      awk 'FNR==NR{a[$1];next}!($1 in a)' file1 file2
      

      就足够了。

      【讨论】:

        猜你喜欢
        • 2017-07-19
        • 2014-05-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多