首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用列值的第一次和最后一次出现删除行

用列值的第一次和最后一次出现删除行
EN

Stack Overflow用户
提问于 2016-01-27 19:38:16
回答 4查看 93关注 0票数 3

我有以下文件

代码语言:javascript
复制
    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栏中第一次和最后一次出现的值,这样我就可以得到如下输出:

代码语言:javascript
复制
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
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-01-27 20:19:31

如果您有tac (或gtac),您可以删除第一个实例,反转文件,删除第一个实例(实际上是最后一个),最后一次翻转该文件。

代码语言:javascript
复制
$ awk '$3==p;{p=$3}' file1 | tac | awk '$3==p;{p=$3}' | tac
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

编辑

这里有一个更灵活的版本。只需将c的初始值设置为所需的列:

使用第3栏:

代码语言:javascript
复制
 c=3 && awk -v c=$c '$c==p;{p=$c}' file1 | tac | awk -v c=$c '$c==p;{p=$c}' | tac

使用第4栏:

代码语言:javascript
复制
 c=4 && awk -v c=$c '$c==p;{p=$c}' file1 | tac | awk -v c=$c '$c==p;{p=$c}' | tac
票数 2
EN

Stack Overflow用户

发布于 2016-01-27 20:07:30

在awk你可以试试这个

代码语言:javascript
复制
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

它产生预期的输出:

代码语言:javascript
复制
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],我们检查最后一行在第三列中的值是否与当前行相同,第二行是否与最后一行相同(即它们在第三列中是否都具有相同的值)。在这种情况下,我们打印最后一行。
票数 4
EN

Stack Overflow用户

发布于 2016-01-27 20:36:10

另一个更简单的awk是:

代码语言:javascript
复制
awk 'NR == 1; prev != $3 {prev = $3; line = 0; next} 
{if (line) print line; line = $0}' foo.txt | column -t

你会得到

代码语言:javascript
复制
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

这样做是将第三列和行存储在名为prevline的变量中,如果它们不是第一次和最后一次出现,则打印出来。

注意,这只需要1次遍历文件,而不是使用tac和多次传递。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35046530

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档