在 Unix 上连接文本文件中的多个字段

2024-03-26

我该怎么做?

File1看起来像这样:

foo 1 scaf 3 
bar 2 scaf 3.3

File2看起来像这样:

foo 1 scaf 4.5
foo 1 boo 2.3
bar 2 scaf 1.00

我想做的是找到同时出现的线条File1 and File2当字段1,2,和3是相同的。

有办法做到吗?


这里是correct答案(就使用标准而言GNU 核心工具工具,而不是编写自定义脚本perl/awk你说出它的名字)。

$ join -j1 -o1.2,1.3,1.4,1.5,2.5 <(<file1 awk '{print $1"-"$2"-"$3" "$0}' | sort -k1,1) <(<file2 awk '{print $1"-"$2"-"$3" "$0}' | sort -k1,1)
bar 2 scaf 3.3 1.00
foo 1 scaf 3 4.5

好的,它是如何工作的:

  1. 首先我们将使用一个很棒的工具join它可以合并两条线。join有两个要求:

    • We can join仅由单个字段。
    • 两个文件都必须是sorted按关键列!
  2. 我们需要生成keys在输入文件中,为此我们使用一个简单的awk script:

    $ cat file1
    foo 1 scaf 3
    bar 2 scaf 3.3    
    
    $ <file1 awk '{print $1"-"$2"-"$3" "$0}'
    foo-1-scaf foo 1 scaf 3
    bar-2-scaf bar 2 scaf 3.3
    

    你看,我们添加了第一列,其中包含一些键,例如“foo-1-scaf”。 我们也做同样的事file2. BTW. <file awk,只是一种奇特的写作方式awk file, or cat file | awk.

    我们也应该sort我们的文件按键,在我们的例子中这是第 1 列,所以我们添加 到命令末尾| sort -k1,1 (sort按第 1 列到第 1 列的文本)

  3. 此时我们就可以生成文件了文件1.with.key and file2.with.key并加入他们, 但假设这些文件很大,我们不想通过文件系统复制它们。相反,我们可以使用称为bash 过程替代 http://tldp.org/LDP/abs/html/process-sub.html将输出生成到命名管道(这将避免任何 不必要的中间文件创建)。欲了解更多信息,请阅读提供的链接。

    我们的目标语法是:join <( some command ) <(some other command)

  4. 最后一件事是解释花哨的连接参数:-j1 -o1.2,1.3,1.4,1.5,2.5

    • -j1- 在第一列中按键连接(在两个文件中)
    • -o- 只输出那些字段1.2(第一个文件字段2),1.3(第一个文件第 3 列)等。

      这样我们就加入了队伍,但是join仅输出必要的列。

从这篇文章中吸取的教训应该是:

  • 你应该掌握核心工具包,这些工具组合起来非常强大,你几乎永远不需要编写自定义程序来处理此类情况,
  • core utils 工具也非常快速且经过严格测试,因此它们始终是最佳选择。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Unix 上连接文本文件中的多个字段 的相关文章

  • 从该共享库中查找加载的共享库的位置?

    从共享库中的函数 在正在运行的进程 用 C 编写 内 我如何发现该共享库是从哪里加载的 我找到的所有答案都涉及使用诸如ldd在命令行中 或者通过查看 proc self maps 在 Win32 上 我只需使用GetModuleFileNa
  • 如何在 Docker 容器中运行 Nginx 而不停止?

    我在 Docker 容器上安装了 Nginx 并尝试像这样运行它 docker run i t p 80 80 mydockerimage usr sbin nginx 问题是 Nginx 的工作方式是 初始进程立即生成一个 Nginx 主
  • Curl,发布当前时间

    我每小时使用 cronjob 我在 Mac 上 触发此命令 usr bin curl s data gr 0123 press OK http www myurl com myphp php gt dev null 有没有办法以 HH MM
  • 使用 java.nio.Files 更改 Linux 下的文件所有者组

    我有一台 Linux 服务器 并且正在 Java 中为服务器上的多个网站运行图像调整大小作业 网站文件由不同的操作系统用户 组拥有 新创建的缩略图 预览由运行调整大小作业的用户拥有 现在我正在谷歌搜索如何在调整大小程序中更改新创建的预览 缩
  • tar 命令在提取时更改所有者:组

    使用此命令提取文件时tar zxf bluez arm package tgz文件和目录的所有者 1000 组 脉冲 是 更改如下例 Example drwxrwxr x 4 1000 pulse 1024 Jul 21 00 32 dbu
  • 未找到神奇函数“bash”

    我有一堆模拟想要在高性能集群上运行 我应该在这些集群上进行预留以获得计算时间 由于预订是有时间限制的 我正在开发一个自动化脚本 我可以scp进入集群并运行 然后 该脚本将下载相关的模拟文件 运行它们 并上传结果 该自动化脚本的一部分位于ba
  • 缺少 /var/lib/mysql/mysql.sock 文件

    我正在尝试访问 mysql 当我运行 mysql 命令时 我得到以下信息 root ip 10 229 65 166 tpdatabase 1 8 0 28356 mysql 错误 2002 HY000 无法连接到 通过socket本地My
  • 堆内存和Slab分配

    我很困惑heap and free list 我有几个问题 我对C中malloc的工作原理有自己的理解 如果我错了 请纠正我 堆内存是否被组织为数据的链表 空闲列表 块 堆内存和空闲列表有区别吗 我对存储分配的理解 有待改进 当我们调用ma
  • 获取 Bash 和 KornShell (ksh) 中命令的退出代码

    我想写这样的代码 command some command safeRunCommand command safeRunCommand cmnd 1 cmnd if 0 then printf Error when executing co
  • Shell 脚本对文件进行计数,然后删除最旧的文件

    我是 shell 脚本新手 所以我需要一些帮助 我有一个充满备份的目录 如果我有超过 10 个备份文件 我想删除最旧的文件 以便仅留下 10 个最新的备份文件 到目前为止 我知道如何计算文件数 这看起来很简单 但是如果计数超过 10 我该如
  • linux命令行:如何简单地将任意字符串输入管道?

    我正在寻找一个非常简单的技巧 假设文件中error txt 有一个很长的字符串 errorMessage key1 some message key2 message 2 由于它的格式不适合读者 如果我想在终端中以格式良好的形式查看它 我可
  • 让子进程等待直到收到父进程的信号

    我想从父级创建 N 个子级 我希望所有的孩子同时开始 一个功能 测量时间 因此 我将该函数放入信号处理程序中 当父级完成创建 分叉 所有子级时 它会向所有子级发送信号 使用kill children id 以让 make 开始 代码如下 但
  • VS Code 不会构建具有多个 .cpp 源文件的 C++ 程序

    请注意 我在 Ubuntu 17 10 上使用 VS Code 并使用 GCC 编译器 我在构建一个使用附加 cpp 文件的简单程序时遇到问题 我可能在这里遗漏了一些明显的东西 因为我对编程相当陌生 但我会解释到目前为止我所做的事情 这阻止
  • 自动将 Linux 文件名重命名为 Windows 中合法的新文件名

    我想将 linux 文件重命名为在 windows 中合法的文件名 它的长度不应超过允许的长度 并且不应包含 Windows 中不允许的字符 有时我将论文的标题复制到文件名 它们有特殊字符 例如 or 另外 从 pdf 中复制和粘贴标题时
  • ModemManager:mmcli 获取信号强度

    我无法检索 Sierre Wireless MC7304 上的信号强度 另外通过 mmcli 发送 AT 命令似乎不起作用 sudo mmcli m org freedesktop ModemManager1 Modem 0 signal
  • 通过 bash 调用应用程序时忽略 dyld_insert_libraries

    对于我的应用程序 我使用 DYLD INSERT LIBRARIES 来切换库 我运行的是 Mac OS X El Capitan 如果我在 shell 中设置这些环境变量 export PYTHONHOME HOME anaconda e
  • 在 bash 中传递多个数组作为参数

    我已经成功地能够调用单个数组作为参数 但在传递多个数组时遇到问题 这是我到目前为止所拥有的 calling function array1 1 2 3 4 array2 a b c d array3 called function arra
  • 如何将 SELECT...INTO 与 JOIN 一起使用?

    我有以下示例代码 DECLARE myRow table rowtype myVar table2 column type BEGIN SELECT table col1 table col3 table col4 table2 colum
  • JPA Criteria API 任意数量的联接/子查询

    我需要使用以下实体构建相交类型查询 为了清楚起见 减少了实体 Entity and other stuff public class Member Id private Long id private String name Entity
  • Linux 中如何确定哪个进程正在使用某个端口

    我目前正在其默认端口上运行 RethinkDB 因为如果我将浏览器指向localhost 8080我看到 RethinkDB Web 界面 我想关闭 RethinkDB 并使用以下命令在另一个端口上重新打开它 port offset争论 然

随机推荐

  • Maybe 应该用来保存错误消息吗?

    我有一个 Haskell 函数 它接受用户输入 还有另一个函数验证此输入 当然 验证可能会失败 在这种情况下 我想返回一条错误消息 提供有关错误操作的一些反馈 我知道有很多方法可以做到这一点 根据我的一点经验 似乎最好的方法是使用Eithe
  • 如何使用 Sprite Kit 逐步模糊 SKSpriteNode 的图像?

    有人可以提供一个如何使用 Apple 的 Sprite Kit 逐渐模糊 SKSpriteNode 图像的示例吗 例如 假设用户触摸屏幕上的按钮 该按钮将触发背景缓慢 即逐渐 模糊 直到达到特定阈值 理想情况下 我也想反转该过程 例如 允许
  • 如何让php artisan作为后台服务器运行,像Apache一样工作?

    我在 VPS 上设置了一个 Laravel 应用程序 它仅用于演示目的 我将使用 PuTTY ssh 登录到 VPS 并输入 php artisan serve host x x x x 一切正常 但是 当我关闭 PuTTY 连接时 服务器
  • 测量 jpeg 中的空白

    我想测量白色 黄色的 jpeg 数量 在可以调整的容差范围内 我正在尝试开发一种质量控制工具来测量杏仁的缺陷 缺陷是棕色杏仁皮上的划痕 见下图 由于这些缺陷是白色 黄色的 我想要一种简单地将图像加载到 R 中并让它测量白色图像的量的方法 然
  • Firebase signinwithemail&password 不是函数

    我最近一直在为我的 IOS 应用程序制作一个应用程序 并将 firebase 电子邮件 密码身份验证引入到我的项目中 注册部分工作正常 但是当我执行handleSignin 函数时 它并没有按预期工作 任何想法为什么 my code imp
  • 在 Unity 中反射碰撞时的射弹

    当射击射弹时我执行 private Rigidbody rigid private Vector3 currentMovementDirection private void FixedUpdate rigid velocity curre
  • 使用 Spring LdapTemplate 从 Active Directory 获取所有属性

    我有一个 Spring Boot 应用程序 它使用 LDAP 来对用户进行身份验证 对于用户 我正在映射 AD 中的属性并填充用户的名字 姓氏 部门 电子邮件 电话以及图像等值 但是 我无法从属性中获取员工编号 当我使用该工具检查属性时活动
  • 如何融合CMMI和Scrum? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我在一家获得 CMMI 5 级认证的商店工作 该认证很重要 因为它使我们能够接触到某些客户和合同 我正在研究如何将 Scrum 与 CMMI 结合起来
  • Apple 推送通知和表情符号字符

    我最近发现这篇关于 APNS 和 Emoji 字符的非常有趣的文章 EASY APNS 只是为了好玩 http www easyapns com category just for fun 它包含一个包含所有支持的表情符号的列表 但是 我无
  • Kotlin - 了解 Getter 和 Setter

    Kotlin 自动生成它的 getter 和设置 但我从不引用它们 另外 在 Kotlin 中编写自定义 getter setter 的正确方法是什么 当我说myObj myVar 99我感到myVar是一个公共领域myObj我直接访问 这
  • Flutter,异步调用后渲染小部件

    我想渲染一个需要 HTTP 调用来收集一些数据的小部件 得到以下代码 简化 import package flutter material dart import dart async import dart convert void ma
  • 如何更新 C# Windows 控制台应用程序中的当前行?

    在 C 中构建 Windows 控制台应用程序时 是否可以写入控制台而无需扩展当前行或转到新行 例如 如果我想显示一个百分比来表示进程距离完成的程度 我只想更新与光标相同的行上的值 而不必将每个百分比放在新行上 这可以通过 标准 C 控制台
  • 如何访问 React Redux 中的存储状态?

    我只是在制作一个简单的应用程序来学习异步与 redux 我已经让一切正常工作 现在我只想在网页上显示实际状态 现在 我如何在渲染方法中实际访问商店的状态 这是我的代码 所有内容都在一页中 因为我刚刚学习 const initialState
  • 从 c++ 为 android (arm) 生成一个 python 库 - 也许用 swig?

    我想在我的项目中包含一个 C 库kivy https kivy org 蟒蛇应用程序 可以自动执行此操作swig https swig org Doc4 1 Python html and 迪斯图尔斯 https docs python o
  • SQL Server 输出子句

    我有点困惑为什么我似乎无法使用下面的语句获得插入行的 新身份 SCOPE IDENTITY 只是返回 null declare WorkRequestQueueID int declare LastException nvarchar MA
  • 图像的色调效果 - iOS

    我只是想知道 是否有可能为图像制作色调效果 但不使用OpenGl ES 最好使用CALayer 我花了一些时间寻找答案 但仍然一无所获 tnx 您是在谈论对图像进行着色吗 一种快速方法 尽管可能不是最好的方法 为此您需要一个自定义解决方案
  • 从 GSL 库中获取 C gsl_fit_linear() 函数中线性回归的 p 值

    我正在尝试用 C 语言重现 R 中的一些代码 因此我尝试使用以下函数来拟合线性回归gsl fit linear 功能 在 R 中 我将使用 lm 函数 它使用以下代码返回拟合的 p 值 lmAvgs lt lm c 1 23 11 432
  • 使所有新目录具有777权限

    我有一个脚本 运行时会在其中创建一个目录 home test 然后在其中写入一些文件 当我运行这个脚本时 它工作得很好 但是 当我从 perl 脚本调用它时 ret home testscript py 它没有权限 因此无法创建该文件夹 或
  • 有没有可用于将 32 位/64 位可执行文件打包在一起的工具? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我真的很喜欢 SysInternals 实用程序 例如 Process Explorer 处理 64 位兼容性的方式 看起来 32 位可执
  • 在 Unix 上连接文本文件中的多个字段

    我该怎么做 File1看起来像这样 foo 1 scaf 3 bar 2 scaf 3 3 File2看起来像这样 foo 1 scaf 4 5 foo 1 boo 2 3 bar 2 scaf 1 00 我想做的是找到同时出现的线条Fil