查找 >2 个文件中的共同元素

2023-11-22

我有三个文件,如下所示

文件1.txt

"aba" 0 0 
"aba" 0 0 1
"abc" 0 1
"abd" 1 1 
"xxx" 0 0

文件2.txt

"xyz" 0 0
"aba" 0 0 0 0
"aba" 0 0 0 1
"xxx" 0 0
"abc" 1 1

文件3.txt

"xyx" 0 0
"aba" 0 0 
"aba" 0 1 0
"xxx" 0 0 0 1
"abc" 1 1

我想根据前两列在所有三个文件中找到相似的元素。为了在两个文件中查找相似的元素,我使用了类似的东西

awk 'FNR==NR{a[$1,$2]++;next}a[$1,$2]' file1.txt file2.txt 

但是,当输入文件超过 2 个时,我们如何在所有文件中找到相似的元素呢? 有人可以帮忙吗?

使用当前的 awk 解决方案,输出会忽略重复的键列,并将输出显示为

"xxx" 0 0

如果我们假设输出来自 file1.txt,则预期输出为:

"aba" 0 0 
"aba" 0 0 1
"xxx" 0 0 

即它也应该获取具有重复键列的行。


尝试以下通用解决方案N文件。它将第一个文件的数据保存在哈希值中1,并且对于下一个文件的每次命中,该值都会递增。最后,我比较每个键的值是否与处理的文件数相同,并仅打印那些匹配的文件。

awk '
    FNR == NR { arr[$1,$2] = 1; next }
    { if ( arr[$1,$2] ) { arr[$1,$2]++ } }
    END { 
        for ( key in arr ) {
            if ( arr[key] != ARGC - 1 ) { continue }
            split( key, key_arr, SUBSEP )
            printf "%s %s\n", key_arr[1], key_arr[2] 
        } 
    }
' file{1..3}

它产生:

"xxx" 0
"aba" 0

EDIT添加打印整行的版本(请参阅注释)。我添加了另一个具有相同键的数组,用于保存该行,并在printf功能。我对旧代码留下了评论。

awk '
    ##FNR == NR { arr[$1,$2] = 1; next }
    FNR == NR { arr[$1,$2] = 1; line[$1,$2] = $0; next }
    { if ( arr[$1,$2] ) { arr[$1,$2]++ } }
    END { 
        for ( key in arr ) {
            if ( arr[key] != ARGC - 1 ) { continue }
            ##split( key, key_arr, SUBSEP )
            ##printf "%s %s\n", key_arr[1], key_arr[2] 
            printf "%s\n", line[ key ] 
        } 
    }
' file{1..3}

NEW EDIT(参见评论)添加一个使用相同键处理多行的版本。基本上我加入所有条目而不是只保存一个,改变line[$1,$2] = $0 with line[$1,$2] = line[$1,$2] ( line[$1,$2] ? SUBSEP : "" ) $0。在打印时,我用分隔符进行反向分割(SUBSEP变量)并打印每个条目。

awk '
    FNR == NR { 
        arr[$1,$2] = 1
        line[$1,$2] = line[$1,$2] ( line[$1,$2] ? SUBSEP : "" ) $0
        next
    }
    FNR == 1 { delete found }
    { if ( arr[$1,$2] && ! found[$1,$2] ) { arr[$1,$2]++; found[$1,$2] = 1 } }
    END { 
        num_files = ARGC -1 
        for ( key in arr ) {
            if ( arr[key] < num_files ) { continue }
            split( line[ key ], line_arr, SUBSEP )
            for ( i = 1; i <= length( line_arr ); i++ ) { 
                printf "%s\n", line_arr[ i ]
            } 
        } 
    }
' file{1..3}

编辑有问题的新数据后,会产生:

"xxx" 0 0
"aba" 0 0 
"aba" 0 0 1
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

查找 >2 个文件中的共同元素 的相关文章

随机推荐

  • 依赖注入 Slim 框架 3

    我正在使用 Slim Framework 3 创建 API 应用程序结构是 MVCP 模型 视图 控制器 提供者 是否可以对我的所有课程进行 Slim Dependency Inject 我正在使用 Composer 自动加载所有依赖项 我
  • KeyedByTypeCollection 在 .Net 中的用途?

    在检查 net 中的通用集合时 我发现了 KeyedByTypeCollection 虽然我使用过它并了解了如何使用它 但我不知道它在哪种场景下有用 我通读了ServiceProvider 缓存等使用泛型完成 无需强制转换 但拿不到太多 我
  • GWT 中需要取消绑定演示者

    我按照此处给出的示例使用 GWT 应用程序中的 MVP 模式http code google com webtoolkit doc latest tutorial mvp architecture html 对于 MainView 中的每个
  • jQuery - 获取 div 中图像的所有 src 并将其放入字段中

    我要修改本教程符合我的要求 但我有一个问题 我是 jQuery 的初学者 我想从特定的 div 获取所有图像源并将它们放入字段中 有一个变量images这是字段并包含一些图像 但我想代替这个从 div 获取所有图像源并将它们放入字段中ima
  • NHibernate 异常:方法 Add 应该是“公共/受保护的虚拟”或“受保护的内部虚拟”

    以这个类为例 public class Category PersistentObject
  • Python 按元素元组运算,如求和

    无论如何 Python 中的元组操作是否可以像这样工作 gt gt gt a 1 2 3 gt gt gt b 3 2 1 gt gt gt a b 4 4 4 代替 gt gt gt a 1 2 3 gt gt gt b 3 2 1 gt
  • 如何弯曲react-navigation-material-bottom-tabs的顶部两个角?

    我是本地反应新手 我正在使用反应导航 反应导航材料底部选项卡 我想做的就是弯曲底部选项卡栏的右上角和左上角 My Code const screen1 createMaterialBottomTabNavigator Home screen
  • Android - 对话框中的共享元素转换

    我想知道是否有任何方法可以在活动 片段和对话框之间使用共享元素 我有一个包含对话框的项目 我想在 Activity 视图层次结构中的 ImageView 到 GalleryDialog 中的相关 ImageView 之间进行转换 我搜索了一
  • 具有核心列表内容的动画页面的聚合物核心过渡

    继从这个问题我进一步发展了演示消息示例尝试使用核心列表在两个页面之间创建页面转换 我正在努力实现以下目标 每个页面上的 fab 上的英雄过渡 两个页面上的幻灯片过渡 方向相反 无论您在列表中滚动到何处 这都会按预期工作 请注意 单击 fab
  • 在 tel:// 链接中插入暂停

    我正在创建一个供 iOS 用户使用的 Web 应用程序 但数据库中的某些电话号码需要添加扩展名 有什么办法可以修改tel URL 方案是否包含暂停或等待 提前致谢 您可以使用 p 暂停 例如 电话 12345678 123 将 更改为 p
  • SaveFileDialog 上的 DialogResult.OK 不起作用

    我尝试 当我按下 保存 时SaveFileDialog我做某事 我尝试修复但总是出错 SaveFileDialog dlg2 new SaveFileDialog dlg2 Filter xml xml dlg2 DefaultExt xm
  • Oracle C# 中的参数化查询

    string sqlCmd SELECT r row id AS resp id r name AS resp name FROM srb s resp r srb s per resp pr srb s contact c srb s u
  • 在没有 Maven 或 ANT 的情况下以编程方式将 WsImport 与 JAXB 插件结合使用?

    我在用WsImport从远程 WSDL 文件生成一些 Java 源代码 请注意 这是来自常规 Scala 项目内部 即它不是在 Maven 或 Ant 构建中完成的 import com sun tools ws WsImport def
  • 同时应用渐变背景颜色和图像

    是否可以同时将背景图像和背景颜色应用于文本字段 我想要实现的是 在文本字段的右上角显示一个图标 还使用样式使该文本字段有点渐变 background moz linear gradient center bottom white D6E5F
  • 如何将“子行”插入 Wicket 数据表

    我有一个AjaxFallbackDefaultDataTable每个测试结果包含一行 测试结果可能会附有注释 需要在测试结果下方显着位置显示 希望给出类似于以下的表格 Test Result Appraisal 1 20 0 PASS 2
  • R Shiny - 如何在更新依赖反应图之前更新依赖反应 selectInput

    应用程序结构 我有一个闪亮的应用程序 具有典型的侧边栏面板 主面板结构 侧边栏面板 侧边栏面板中有多个 selectInput 小部件 其中每个 selectInput 中的选择取决于 前一个 selectInput 的选择值 即 用户从
  • Sequelize:错误:错误:表1未与表2关联

    我正在尝试使用sequelize 创建以下关联 但我不断收到以下错误 错误 错误 客户未与订单关联 根据我在文档中发现的内容 我有双向关联 我对问题可能是什么感到困惑 因为当我查看数据库表时 我可以看到外键 对于此示例 我尝试提取与特定订单
  • Jenkins 无法启动硒测试(等待创建配置文件超时)

    Jenkins 无法启动 Selenium 测试 ubuntu 错误 11 26 24 652 信息 启动 org openqa jetty jetty Server ab50cd 11 26 24 738 信息 正在准备 Firefox
  • Google 趋势配额限制

    我试图从 Google 趋势中提取数据 仅尝试了 2 次就收到 您已达到每日限制 错误 有什么办法可以解决这个问题吗 我知道 Google API 项目有特殊的配额限制 但 Google Trends 没有 API 我还读到我们可能需要向它
  • 查找 >2 个文件中的共同元素

    我有三个文件 如下所示 文件1 txt aba 0 0 aba 0 0 1 abc 0 1 abd 1 1 xxx 0 0 文件2 txt xyz 0 0 aba 0 0 0 0 aba 0 0 0 1 xxx 0 0 abc 1 1 文件