AWK过滤给定变量的第一行和最后一行,丢弃中间行

问题描述 投票:0回答:3

我试图通过使用AWK在制表符分隔的txt文件中选择给定变量的第一行和最后一行来过滤文件。

制表符分隔文件如下所示:

1 apple  30
2 apple  35
3 apple  36
4 apple  20
5 pear   10
6 pear   30
7 pear   45
8 orange 16 

END 

我试图使用awk处理这个,只打印$ 2中每个变量的第一行和最后一行(本例中的水果列)

我实际拥有的文件长度约为35000行,并且我希望用作过滤器的列中有3000个唯一变量(所以在上面的示例中为col2)

我认为这种方法是创建一个独特的col2值数组(苹果,梨,橙),然后使用这个数组提取较大文件中的第一个和最后一个值...但有些人建议选择所需的命名法每个索引变量的第一行和最后一行将非常感激。 :)

上面给出的INPUT文件,预期输出将是

1 apple  30
4 apple  20
5 pear   10
7 pear   45
8 orange 16

输出需要包括那些只有一个条目(在这种情况下为橙色)

unix awk filtering
3个回答
0
投票

单程:

awk '$2!=prev{if (pline){print pline;}print;}{prev=$2;pline=$0;}END{print pline;}' file | uniq

每次遇到新的第二列线时都打印。在打印新的第二列线时,如果prev行不为空,也打印它。 uniq用于删除在其间存在单个记录的情况下打印的重复行。


0
投票

即使相同的数据同时显示给定键值的第一行和最后一行,或者数据包含空行或0行(假设您希望那些处理像其他每行一样,如果没有,则很容易跳过),这将起作用:

$ cat tst.awk
$2 != prev2 {
    if ( NR > 1 ) {
        print rec
    }
    beg = rec = $0
    prev2 = $2
    next
}
{ rec = beg ORS $0 }
END { print rec }

$ awk -f tst.awk file
1 apple  30
4 apple  20
5 pear   10
7 pear   45
8 orange 16

0
投票

尝试过gnu awk,不需要外部程序

awk '{if($0~/^[a-z0-9]/) a[NR]=$0} END{f=1;asort(a); for(;i++<NR;){split(a[i],b);if(b[2]==$2||f){$1=b[1];$2=b[2];$3=b[3];if(f){f=0;print}} else if(b[2]){print;print b[1],($2=b[2]),b[3]}} }' d
© www.soinside.com 2019 - 2024. All rights reserved.