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. by last[(NR-1)%3]==last[(NR-2)%3] && last[(NR-1)%3]==last[NR%3] 我们检查最后一行在第三列中是否与当前行具有相同的值,而倒数第二行是否与最后一行具有相同的值(即,它们在第三列中是否都具有相同的值)。在这种情况下,我们打印最后一行。

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

相关文章:

regex - 只匹配一个模式一次

linux - 为什么使用 tail 复制文件比 cp 慢很多,而使用 awk 快两倍?

bash - 将 sed 与 html 数据一起使用

shell - 在 AWK 中运行 shell 命令

linux - 附加到特定行的末尾

linux - Bash,如果文件为空,如果不继续则离开脚本

r - 计算模式并区分它们

notepad++ - 在Notepad++中进行智能突出显示时显示出现次数

linux - 列中的最小值和最大值

Linux合并多个文件