awk - 删除第一次和最后一次出现列值的行

标签 awk sed find-occurrences

我有以下文件

    ID      Score    Other
    ABR     0.98     NBNMSB
    BCG     0.76     NBNMSB
    CVD     0.6      NBNMSB
    BCG     0.9      VSCVA
    CVD     0.56     VSCVA
    ABR     0.9      VSCVA
    CVD     0.7      BAVSC
    BCG     0.4      BAVSC
    ABR     0.5      BAVSC
    AAC     0.1      BAVSC
    ABR     0.8      NBNMSB
    BCG     0.6      NBNMSB
    CVD     0.3      NBNMSB
    BCG     0.7      VSCVA
    CVD     0.0      VSCVA
    ABR     0.1      VSCVA
    CVD     0.5      BAVSC
    BCG     0.8      BAVSC
    ABR     1.0      BAVSC

我想排除第 3 列中值的第一次和最后一次出现,以便得到如下输出:
ID      Score    Other
BCG     0.76     NBNMSB
CVD     0.56     VSCVA
BCG     0.4      BAVSC
ABR     0.5      BAVSC
BCG     0.6      NBNMSB
CVD     0.0      VSCVA
BCG     0.8      BAVSC

最佳答案

在 awk 你可以试试这个

awk 'NR==1
     {last[NR%3]=$3;lastLine[NR%3]=$0;}
     last[(NR-1)%3]==last[(NR-2)%3] && 
           last[(NR-1)%3]==last[NR%3]{print lastLine[(NR-1)%3]}' test

这产生了预期的输出:
ID      Score    Other
BCG     0.76     NBNMSB
CVD     0.56     VSCVA
BCG     0.4      BAVSC
ABR     0.5      BAVSC
BCG     0.6      NBNMSB
CVD     0.0      VSCVA
BCG     0.8      BAVSC

说明
1. NR==1 简单打印第一行。
2. {last[NR%3]=$3;lastLine[NR%3]=$0;}将最后两行和当前行存储在一个数组中 ( lastLine )。
3. 来自 last[(NR-1)%3]==last[(NR-2)%3] && last[(NR-1)%3]==last[NR%3]我们检查最后一行在第三列中是否与当前行具有相同的值,在倒数第二行是否与最后一行具有相同的值(即,它们在第三列中是否都具有相同的值)。在这种情况下,我们打印最后一行。

关于awk - 删除第一次和最后一次出现列值的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35046530/

相关文章:

windows - awk 和 WinGrep 中的正则表达式

linux - Bash:比较两个变量中的IP地址

regex - sed:将部分输出复制到表中

c - 如何通过计数值出现的数量并将其打印在该值旁边来制作一个新数组?

python-3.x - python 3.4 计算 .txt 文件中的出现次数

java - 如何将文本文件与多个正则表达式模式匹配并计算这些模式的出现次数?

bash - awk 对一列求和并在输入的每一行上打印该总和

linux - 使用youtube-dl将当前文件夹中的项目与播放列表同步

python - 从 xml 中提取值

regex - 在 sed 和 perl 中替换单引号