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/

相关文章:

awk - awk 和 mawk 中的 float 比较

linux - 如何使用 Bash(sed 或任何其他)命令在第 EOF-n 行插入

java - 如何使用 Shell 脚本在日期模式之前换行?

linux - 添加从特定 Ips 生成的总累积数据

date - 如何将特定列中的文件 csv 日期转换为 unix 日期

sed - 使用sed删除最后一个逗号

r - 计算单个列中值的连续出现

php - 计算值的出现次数并将其作为 value_name=>occurrences 对返回

java - 文件中 HashMap 字符串出现次数 [JAVA]

sed - 删除包含另一个图案的多线图案