我有以下文件
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发布于 2016-01-27 20:19:31
如果您有tac (或gtac),您可以删除第一个实例,反转文件,删除第一个实例(实际上是最后一个),最后一次翻转该文件。
$ 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栏:
c=3 && awk -v c=$c '$c==p;{p=$c}' file1 | tac | awk -v c=$c '$c==p;{p=$c}' | tac使用第4栏:
c=4 && awk -v c=$c '$c==p;{p=$c}' file1 | tac | awk -v c=$c '$c==p;{p=$c}' | tac发布于 2016-01-27 20:07:30
在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解释
{last[NR%3]=$3;lastLine[NR%3]=$0;}将最后两行和当前行存储在数组(lastLine)中。last[(NR-1)%3]==last[(NR-2)%3] && last[(NR-1)%3]==last[NR%3],我们检查最后一行在第三列中的值是否与当前行相同,第二行是否与最后一行相同(即它们在第三列中是否都具有相同的值)。在这种情况下,我们打印最后一行。发布于 2016-01-27 20:36:10
另一个更简单的awk是:
awk 'NR == 1; prev != $3 {prev = $3; line = 0; next}
{if (line) print line; line = $0}' foo.txt | column -t你会得到
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这样做是将第三列和行存储在名为prev和line的变量中,如果它们不是第一次和最后一次出现,则打印出来。
注意,这只需要1次遍历文件,而不是使用tac和多次传递。
https://stackoverflow.com/questions/35046530
复制相似问题