从文件中删除由具有特定关键字的白线分隔的一组行

2023-12-23

我有一个包含如下行的文件。如果一组行中的任何行包含关键字 SEDS2-TOP,我想从文件中删除一组行。每组行由空行分隔。

0.00  600.00  2214.28   785.71 1.00000 SEDS1-BOTTOM
0.00  600.00  2214.28   785.71 1.00000 SEDS1-TOP
0.00  600.00  1500.00     0.00 1.00000 WATER-BOTTOM

0.00  600.00  3446.97  1757.08 1.00000 SEDS2-TOP
0.00  600.00  2218.64   790.51 1.00000 SEDS1-BOTTOM
0.00  600.00  2218.64   790.51 1.00000 SEDS1-TOP
0.00    0.00  600.00  1500.00  1.00000 WATER-BOTTOM

0.00  400.00  2004.28   785.71 1.00000 SEDS1-BOTTOM
0.00  300.00  2254.28   785.71 1.00000 SEDS1-TOP
0.00  600.00  1600.00     0.00 1.00000 WATER-BOTTOM

0.00  600.00  3446.97  1757.08 1.00000 SEDS2-TOP
0.00  600.00  1500.00     0.00 1.00000 WATER-BOTTOM

0.00  600.00  3446.97  1757.08 1.00000 SEDS2-TOP

输出文件应具有的示例

0.00  600.00  2214.28   785.71 1.00000 SEDS1-BOTTOM
0.00  600.00  2214.28   785.71 1.00000 SEDS1-TOP
0.00  600.00  1500.00     0.00 1.00000 WATER-BOTTOM

0.00  400.00  2004.28   785.71 1.00000 SEDS1-BOTTOM
0.00  300.00  2254.28   785.71 1.00000 SEDS1-TOP
0.00  600.00  1600.00     0.00 1.00000 WATER-BOTTOM

你可以这样做awk使用 3 规则和END规则。可以写成如下:

awk 'NF==0 {              # empty line
    for (i in a)          # for each line in array a
        print i           # output line (index)
    if (i in a)           # if lines exists
        print ""          # output blank line at end
    delete a              # clear a array
    del=0                 # set delete group flag 0
    next                  # get next record
}
/SEDS2-TOP/ {             # SEDS2-TOP matched in record
    del=1                 # set delete group flag 1
    delete a              # delete array a
    next                  # get next records
}
del==0 {                  # del group flag is zero
    a[$0]++               # add line as index to array a
}
END {                     # END rule - process last group of lines
    if (del==0) {         # if del group flag not set
        for (i in a)      # loop over lines in a
            print i       # output line (index)
        print ""          # with newline after
    }
}' rowsets

使用/输出示例

使用数据文件作为输入,您可以简单地选择复制上面的脚本(并更改包含行集的文件名rowsets到您拥有的任何内容,然后用鼠标中键将文件粘贴到终端的目录中,例如

$ awk 'NF==0 {              # empty line
>     for (i in a)          # for each line in array a
>         print i           # output line (index)
>     if (i in a)           # if lines exists
>         print ""          # output blank line at end
>     delete a              # clear a array
>     del=0                 # set delete group flag 0
>     next                  # get next record
> }
> /SEDS2-TOP/ {             # SEDS2-TOP matched in record
>     del=1                 # set delete group flag 1
>     delete a              # delete array a
>     next                  # get next records
> }
> del==0 {                  # del group flag is zero
>     a[$0]++               # add line as index to array a
> }
> END {                     # END rule - process last group of lines
>     if (del==0) {         # if del group flag not set
>         for (i in a)      # loop over lines in a
>             print i       # output line (index)
>         print ""          # with newline after
>     }
> }' rowsets
0.00  600.00  1500.00     0.00 1.00000 WATER-BOTTOM
0.00  600.00  2214.28   785.71 1.00000 SEDS1-BOTTOM
0.00  600.00  2214.28   785.71 1.00000 SEDS1-TOP

0.00  400.00  2004.28   785.71 1.00000 SEDS1-BOTTOM
0.00  300.00  2254.28   785.71 1.00000 SEDS1-TOP
0.00  600.00  1600.00     0.00 1.00000 WATER-BOTTOM

保留行顺序

如果需要保留行顺序,则可以引入一个新的计数器变量作为与数组中的行号相对应的索引,而不是使用行作为索引。这允许您按原始顺序输出行,例如

awk -v ndx=1 '
NF==0 {                   # empty line
    for (i=1; i<ndx; i++) # for each line in array a
        print a[i]        # output line
    if (ndx > 1)          # if lines exists
        print ""          # output blank line at end
    delete a              # clear a array
    del=0                 # set delete group flag 0
    ndx=1                 # reset array index 1
    next                  # get next record
}
/SEDS2-TOP/ {             # SEDS2-TOP matched in record
    del=1                 # set delete group flag 1
    delete a              # delete array a
    ndx=1                 # reset array index 1
    next                  # get next records
}
del==0 {                  # del group flag is zero
    a[ndx++]=$0           # add line to array a
}
END {                     # END rule - process last group of lines
    if (del==0) {         # if del group flag not set
        for (i=1; i<ndx; i++)   # loop over lines in a
            print i       # output line (index)
        print ""          # with newline after
    }
}' rowsets

在这种情况下,您的输出将是:

0.00  600.00  2214.28   785.71 1.00000 SEDS1-BOTTOM
0.00  600.00  2214.28   785.71 1.00000 SEDS1-TOP
0.00  600.00  1500.00     0.00 1.00000 WATER-BOTTOM

0.00  400.00  2004.28   785.71 1.00000 SEDS1-BOTTOM
0.00  300.00  2254.28   785.71 1.00000 SEDS1-TOP
0.00  600.00  1600.00     0.00 1.00000 WATER-BOTTOM

检查一下,如果您还有其他问题,请告诉我。

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

从文件中删除由具有特定关键字的白线分隔的一组行 的相关文章

  • 在 bash 中使用单个命令为 shell 变量分配默认值

    我对 bash 3 00 shell 脚本中的变量进行了大量测试 如果未设置变量 则它会分配默认值 例如 if z VARIABLE then FOO default else FOO VARIABLE fi 我似乎记得有一些语法可以在一行
  • shell脚本中关联数组的时间复杂度

    我想知道在 shell 脚本中使用关联数组时如何构造 实现 另外 我想知道基于 shell 脚本的关联数组的时间复杂度是否是最佳的 因为我们可以使用字母和数字作为它们各自的键 编辑 他们使用什么哈希函数 如果您使用关联数组 则不能通过 使用
  • 如何在递归调用函数时阻止 bash 创建子 shell

    这是一个计算阶乘的简单 shell 函数 bin bash function factorial if 1 lt 2 then echo 1 else echo 1 factorial 1 1 fi factorial 1 但我发现这个脚本
  • 通过特定分隔符删除字符串

    我的文件中有几列 其中第二列有 分隔符 我想删除第二列中的第一个 第三个和第四个字符串 并将第二个字符串留在该列中 但我有正常的分隔符空间 所以我不知道 input 22 16050075 A G 16050075 A G 22 16050
  • 将文件从不同目录复制到公共目录

    我有很多目录 其中包含 c文件 我想复制全部 c使用 shell 脚本将不同目录中的文件复制到单个目录 find name c exec cp t tmp 启动当前目录中的所有项目 递归 获取名称结尾的项目 c 将这些项目复制到 tmp 如
  • if [ -z "${FILE_LIST}" ] 中的 -z 是什么

    遇到了这个 什么是 z在 shell 脚本中if z FILE LIST 是相同的test And man test gives z STRING the length of STRING is zero 注意 在某些平台上 是一个符号链接
  • 迭代 bash 脚本中的变量名称

    我需要在一堆文件上运行一个脚本 这些文件的路径被分配给train1 train2 train20 我想 为什么不使用 bash 脚本使其自动执行呢 所以我做了类似的事情 train1 path to first file train2 pa
  • 如何判断 Bash 中是否存在文件?

    这会检查文件是否存在 bin bash FILE 1 if f FILE then echo File FILE exists else echo File FILE does not exist fi 我如何只检查文件是否存在not ex
  • 使用 find 命令搜索直到第一个匹配项

    我只需要搜索可以在任何地方的特定目录有没有办法运行此命令直到第一个匹配 谢谢 我现在使用 find noleaf name experiment type d wc l 正如鲁道夫 米尔鲍尔 Rudolf M hlbauer 所提到的 qu
  • Git difftool 未启动外部 DiffMerge 程序

    我一直遵循 戴夫的博客条目 http www davesquared net 2009 05 setting up git difftool on windows html 链接在此answer https stackoverflow co
  • 动态参数值取决于另一个动态参数值

    启动前提 非常严格的环境 Windows 7 SP1 Powershell 3 0 使用外部库的可能性有限或不可能 我正在尝试重写之前创建的 bash 工具 这次使用 PowerShell 在 bash 中 我实现了自动完成功能 以使该工具
  • 如何查找所有以句号结尾的单词?

    我有一个包含许多以 a 结尾的单词的文件 其中大部分是缩写 例如 etc p s 如何输出一个仅显示一次所有这些单词的列表 所有单词前面都有一个空格 因此可以使用该空格来查找单词的开头 没有一个单词出现在该行的开头 文件中没有句子 因此句点
  • 获取变量的名称作为输入并使用该名称更改变量

    我从脚本用户那里获取变量的名称作为第一个参数 并将该变量的值回显到控制台 bin bash variablename 1 echo The value of variablename is variablename 这太棒了 我无法开始工作
  • 在 iOS 模拟器中安装应用程序的脚本

    我正在尝试自动化构建应用程序 运行单元测试以及最终运行 UI 测试的过程 我正在通过命令行 xcodebuild sdk iphonesimulator6 0 在某个目录中构建应用程序 如何通过命令行 在 Library Applicati
  • 从 php 执行 bash 脚本并立即输出回网页

    我有一组 bash 和 Perl 脚本 开发在 Linux Box 上部署所需的目录结构 可选 从svn导出代码 从这个源构建一个包 这在终端上运行良好 现在 我的客户请求此流程的 Web 界面 例如 某些页面上的 创建新包 按钮将一一调用
  • 从 shell 命令调用 SOAP 请求

    我使用curl 向Web 服务发送SOAP 请求 并使用shell 脚本获取响应 请在下面找到我正在使用的命令 curl H Content Type text xml charset utf 8 H SOAPAction d sample
  • 如何查看正在运行的 tcsh 版本?

    如何查看我的 UNIX 终端中运行的 tcsh 的当前版本 看着那 这version多变的 echo version tcsh 6 14 00 Astron 2005 03 25 i386 intel linux options wide
  • 使用 su 和 Expect 脚本登录用户时遇到问题

    我正在为一个班级制作一个网站 您可以使用用户名和密码登录 然后它会将您带到一个显示您在班级中的成绩的页面 该网站正在运行bash脚本 https github com jduga002 rapache 并将托管在用户已有用户名和密码登录的计
  • 协助 awk/bash 捕获内存差异

    我正在尝试从以下文件中提取以下输出 xr lab show clock Thu Sep 19 14 38 02 812 WIB 14 38 02 893 WIB Thu Sep 19 2019 xr lab xr lab xr lab sh
  • bash中的用户名、密码程序

    我有一个程序 要求用户输入用户名和密码 然后将其存储在文本文件中 第一列是用户名 第二列是密码 我需要一个命令 在用户输入用户名和新密码时替换密码 如下我拥有的 bin bash admin menu Register User echo

随机推荐