如何消除数字范围中的重叠 (AWK)

2024-03-03

我正在尝试删除文件内的重叠部分。

  • 有一堆以“A”开头的记录,并且具有“起始值”和“结束值”。
  • 还有一堆以“B”开头的记录,也有范围,并且显示与以“A”开头的记录可能重叠。这个想法是从 A 中删除重叠范围,以便只存在非重叠范围。

B 中的某些记录具有与 A 相同的“起始值”,而其他记录则具有与 A 相同的“结束值”。因此,如果 A 的范围为 0 - 100,B 的范围为 0 - 32。那么我的预期输出是: A 33 - 100 和 B 0 - 32。

虽然我有很多文件需要经过这个操作,但是单个文件都非常小。

这是一个示例文件:

A   0       100
A   101     160 
A   200     300
A   500     1100
A   1200    1300
A   1301    1340
A   1810    2000
B   0       32
B   500     540
B   1250    1300
B   1319    1340
B   1920    2000

预期样本输出

A   33      100
A   101     160 
A   200     300
A   541     1100
A   1200    1249
A   1301    1318
A   1810    1919
B   0       32
B   500     540
B   1250    1300
B   1319    1340
B   1920    2000

感谢你的帮助!


好吧,既然OP确认了B 501 540是错字,我发布我的答案:)

awk -v OFS="\t" '/^A/{s[NR]=$2;e[NR]=$3;l=NR}
/^B/{ 
        for(i=1;i<=l;i++){
                if(s[i]==$2){
                        s[i]=$3+1
                        break
                }else if(e[i]==$3){
                        e[i]=$2-1
                        break
                }
        }
        s[NR] = $2; e[NR]=$3
}
END{for(i=1;i<=NR;i++)print ((i<=l)?"A":"B"),s[i],e[i]}
        ' file

使用您的文件进行测试(拼写错误已修复):

kent$  awk -v OFS="\t" '/^A/{s[NR]=$2;e[NR]=$3;l=NR}
/^B/{ 
        for(i=1;i<=l;i++){
                if(s[i]==$2){
                        s[i]=$3+1
                        break
                }else if(e[i]==$3){
                        e[i]=$2-1
                        break
                }
        }
        s[NR] = $2; e[NR]=$3
}
END{for(i=1;i<=NR;i++)print ((i<=l)?"A":"B"),s[i],e[i]}
        ' file
    A       33      100
    A       101     160
    A       200     300
    A       541     1100
    A       1200    1249
    A       1301    1318
    A       1810    1919
    B       0       32
    B       500     540
    B       1250    1300
    B       1319    1340
    B       1920    2000

EDIT对于 6 列:

又脏又快,请检查以下示例:

file:

kent$  cat file
A   0       100 1 2 3
A   101     160 4 5 6
A   200     300 7 8 9
A   500     1100 10 11 12
A   1200    1300 13 14 15
A   1301    1340 16 17 18
A   1810    2000 19 20 21
B   0       32  22 23 24
B   500     540 22 23 24
B   1250    1300 22 23 24
B   1319    1340 22 23 24
B   1920    2000 22 23 24

awk :

kent$  awk -v OFS="\t" '{s[NR]=$2;e[NR]=$3}
/^A/{l=NR}
/^B/{ 
        for(i=1;i<=l;i++){
                if(s[i]==$2){
                        s[i]=$3+1
                        break
                }else if(e[i]==$3){
                        e[i]=$2-1
                        break
                }
        }
}
{r[NR]=$4OFS$5OFS$6}
END{for(i=1;i<=NR;i++)print ((i<=l)?"A":"B"),s[i],e[i],r[i]} ' file
A       33      100     1       2       3
A       101     160     4       5       6
A       200     300     7       8       9
A       541     1100    10      11      12
A       1200    1249    13      14      15
A       1301    1318    16      17      18
A       1810    1919    19      20      21
B       0       32      22      23      24
B       500     540     22      23      24
B       1250    1300    22      23      24
B       1319    1340    22      23      24
B       1920    2000    22      23      24
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何消除数字范围中的重叠 (AWK) 的相关文章

  • 如何用制表符替换换行符?

    我有如下所示的图案 hi hello hallo greetings salutations no more hello for you 我正在尝试使用以下命令用制表符替换所有换行符 sed e s n t g 但它不起作用 有人可以帮忙吗
  • 在特定数量的分隔符后添加 '\n'

    我怎样才能添加一个 n每四次之后 CSV 文件中的分隔符 使用 bash 输入文件示例 aaaa bbbbbb cccc ddddd eeee ffff gggg hhhh iii jjjj kkkk llll 需要输出 aaaa bbbb
  • 检查文件中是否存在所有多个字符串或正则表达式

    我想检查一下是否all我的字符串存在于文本文件中 它们可以存在于同一行或不同行上 部分匹配应该没问题 像这样 string1 string2 string3 string1 string2 string1 string2 string3 s
  • 在mawk中使用strftime函数

    我正在尝试创建 AWK 脚本 该脚本将根据某种模式过滤输入文件 并使用 strftime 函数进行一些计算 2 HB 2 n print strftime Y 使用的解释器是mawk 使用此命令触发此脚本时 awk f script3 in
  • 过滤出现在两个标记之间的文本

    Part 1 创建仅输出由两个预定义标记包围的文本的文本过滤器的最简单方法是什么 我不介意使用任何标准工具 sed awk python 例如 我希望只显示由 标记开始 和 标记结束 包围的文本 input Text 1 Mark Begi
  • 从命令行查找并替换多行文本

    我正在尝试使用还执行其他操作的脚本编辑配置文件 该脚本需要找到某些连续的文本行并将其删除 它需要在适当的位置粘贴一个新配置 该新配置从旧配置所在的同一行开始 在新旧配置中 空间的使用都很重要 在 configfile php 中 此文本块
  • 将多行转换为逗号分隔的行[重复]

    这个问题在这里已经有答案了 我在多行中有以下数据 foo bar qux zuu sdf sdfasdf 我想要做的是将它们转换为一个逗号分隔的行 foo bar qux zuu sdf sdfasdf 能做到这一点的最好的 Unix 单行
  • win-7 cmd 上的 GNU awk,不会将输出重定向到文件

    如果相关的话 我直接从sourceforge中的GNU指向源下载了GNU awk V 3 1 6 我正在使用 Windows 版 wget 获取 URL 页面 处理传入的文件后 我将其减少为单行 我必须从中提取一个键值 这是一个相当长的字符
  • awk + ​​如何查找列中的重复项?

    如何查找列中的重复项 head countries lat long int code3 csv cat n 1 country latitude longitude name code 2 AD 42 546245 1 601554 An
  • bash while 循环没有按预期工作

    我知道从技术上讲 它可能会按原样工作 并且这是人们所期望的bash语言 但这不是我所期望和写的 我试图让一切尽可能简单 This is fileA Name Status Networks Image Plans HostName A PA
  • 使用 awk 仅从字符串中获取数字

    背景 我有一个专栏should以 描述文本 ref12345678 的形式获取用户输入 我有现有的脚本可以获取参考号 但不幸的是一些用户错误地添加了它 所以而不是 ref12345678 有可能 ref 12345678 RF1234567
  • 使用 awk 计算行的平均值

    我一直在编写一个脚本 通过读取 txt 文件的输入来计算行的平均值 示例文本输入文件输入 txt 157361 155687 156158 156830 149610 151824 152353 152027 159195 158490 1
  • BASH - 使用 Loop 和 If 语句总结唯一字段中多个字段的信息

    我有以下制表符分隔的文件 A1 A1 0 0 2 1 1 1 1 1 1 1 2 1 1 1 A2 A2 0 0 2 1 1 1 1 1 1 1 1 1 1 1 A3 A3 0 0 2 2 1 1 2 2 1 1 1 1 1 1 A5 A5
  • awk 中的提示和技巧 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何将文件的内容与列最后一个数字的增量连接起来

    我有一个包含一些内容的文件 需要重复第 n 次并添加最后一列号的增量 Input content of a file TCTA 7 ccta TCTA 1 TCTA 8 ccta TCTA 1 TCTA 9 ccta TCTA 1 TCTA
  • 了解 OFS 在 AWK 中的工作原理

    这是后续我的问题 https stackoverflow com questions 55876705 awk ofs is not working with fs character set了解有关 AWK 中 OFS 的更多信息 我的理
  • 如何使用 awk 将一组重复的行转置为列

    我有一个文本文件 其中包含 7 列数据 格式如下 18030 AAJ51 FTO rs9939609 C 30090620 10 A T 18030 AAJ51 CAT rs1001179 C 11468118 10 C C 18030 A
  • 如何保留awk中字段之间的原始空格?

    当处理输入时awk 有时我想编辑其中一个字段 而不触及其他任何内容 考虑一下 ls l awk 1 total 88 rw r r 1 jack jack 8 Jun 19 2013 qunit 1 11 0 css rw r r 1 ja
  • 在 shell 脚本中禁止输出到屏幕

    你好 我写了一个小脚本 usr bin ksh for i in DAT do awk BEGIN OFS FS 3 353 3 353861958962 print i gt gt i changed awk 3 353 i change
  • 使用awk对字段进行排序和排列

    我现在正在尝试学习 awk 我想做一项特定的任务 我的问题与之前发布的问题范围相似 使用 awk 将列转置为行 https stackoverflow com questions 13634816 using awk to transpos

随机推荐

  • 在 Xcode 6.0.1 中使用仪器进行分析时应用程序挂起

    我观察到 每当我使用 Xcode 6 0 1 中的工具分析我的应用程序时 每次浏览应用程序时应用程序都会挂起 我正在使用 iPhone 5S iOS 8 0 2 来运行我的应用程序 当我在设备上运行该应用程序时 它运行得很好 找到修复 禁用
  • 使用 php 将事件插入谷歌日历

    如何将活动插入 Google 日历 我正在使用本指南 https developers google com google apps calendar v3 reference events insert https developers
  • 在android上使用ormlite删除?

    我有一个客户端 bean DatabaseField columnName client id generatedId true useGetSet true private Integer clientId DatabaseField c
  • 如何在网页视图中播放本地 swf 文件

    我正在尝试在 webview 中播放本地 swf 文件 保存在 asset 或 sdcard 中 但我没有运气 任何人都可以指导我正确的方法吗 我可以通过 url 播放 swf 文件 但是在 webview 中播放本地文件时遇到困难 swf
  • 如何使用 gson 库将字符串转换为 JsonObject

    请指教如何转换String to JsonObject using gson图书馆 我不成功的做法 String string abcde Gson gson new Gson JsonObject json new JsonObject
  • 如何忽略部分文本并在剩余部分进行搜索和替换? [复制]

    这个问题在这里已经有答案了 在文本文件中进行正则表达式查找和替换时 我想跳过并忽略文本的某些片段 也就是说 应该将文本的某些部分排除在搜索之外 而只对其余部分进行搜索和替换 标准是 1 任何介于START and END应从搜索和替换中排除
  • 通过 Enum 快速递增

    我喜欢 Swift 允许使用枚举方法 我正在尝试使用一种方法 但正在寻找一种更具可扩展性的方法来执行此操作 enum CopyState case binary hex both init self both mutating func n
  • 转换运算符:gcc 与 clang

    考虑以下代码 https godbolt org z s17aoczj6 https godbolt org z s17aoczj6 template
  • 使用 D3 创建 DIV 动态列表

    我一直在使用D3 http d3js org创建精美的动画图表 并且示例很棒 然而 我正在尝试做一些看似更基本的事情 但遇到了麻烦 将数据绑定到简单的 DIV 列表 我设置了enter 以不透明度 0 初始化元素 transition 让它
  • 使用尺寸类别时 UITableViewCell 子视图报告不正确的宽度

    由于某种原因 当在 xcode 6 中使用尺寸类时 我的单元格中的子视图宽度不正确 我有一个UIImageView使用自动布局调整大小 常量 顶部 左 右 底部为 10 当从以下位置调用以下内容时tableView tableView UI
  • jQuery 'mmenu' 打开时的回调事件

    使用 jQuery菜单插件 http mmenu frebsite nl 我需要在菜单打开后调用 JavaScript 函数 我看不到从API文档 http mmenu frebsite nl documentation api html如
  • 如何将字符转换为等效的 System.Windows.Input.Key Enum 值?

    我想写一个这样的函数 public System Windows Input Key ResolveKey char charToResolve Code goes here that resolves the charToResolve
  • Flask SQLAlchemy 不会关闭 MySQL 数据库连接

    我有一个 Flask 应用程序 使用 Flask SQLAlchemy 和 MySQL 数据库 其中数据库定义如下 db py from flask sqlalchemy import SQLAlchemy db SQLAlchemy ma
  • VBA宏快速删除行

    我有几个非常大的 Excel 数据文件 我需要遍历它们并删除 T 列中单元格值为 1 的所有行 现在我的代码如下所示 Sub test Dim cell As Range For Each cell In Worksheets Sheet1
  • 下载blob存储并返回Json对象

    我正在尝试下载一个 json我存储在容器中的 blobAzure Storage using Newtonsoft Json将其写入对象 我通过调用来做到这一点 CloudBlockBlob blob DownloadToStream st
  • PostgreSQL - 错误:查询没有结果数据的目标

    为什么我会收到以下错误 错误 查询没有结果数据的目标 这是我的功能 CREATE OR REPLACE FUNCTION public SumASCII value character varying RETURNS int LANGUAG
  • 由点聚类着色的等高线图 matlab

    我有两个向量 它们是成对的值 size X 1e4 x 1 size Y 1e4 x 1 是否可以绘制一个contour plot某种方式通过最高密度的点来制作轮廓 即最高聚类 红色 然后在其他地方渐变颜色 如果您需要更多说明 请询问 问候
  • 引用另一个 Snakemake 规则的输入或输出文件

    如何以编程方式引用另一个 Snakemake 规则的属性 我需要更换什么
  • 为什么惰性评估有用?

    我长期以来一直想知道为什么惰性评估有用 我还没有人以一种有意义的方式向我解释 大多数情况下 它最终都会归结为 相信我 注意 我的意思不是记忆 主要是因为它可以更有效 如果不使用值 则不需要计算它们 例如 我可以将三个值传递到一个函数中 但根
  • 如何消除数字范围中的重叠 (AWK)

    我正在尝试删除文件内的重叠部分 有一堆以 A 开头的记录 并且具有 起始值 和 结束值 还有一堆以 B 开头的记录 也有范围 并且显示与以 A 开头的记录可能重叠 这个想法是从 A 中删除重叠范围 以便只存在非重叠范围 B 中的某些记录具有