删除最后出现的图案线条

时间:2015-08-22 09:03:14

标签: bash awk text-processing

我想为每个可能的3位数字排除/删除模式{n} {n} {n} .log的最后一行。每行以样本模式“123.log”结束。

示例输入文件:

aaaa116.log
a112.log
aaa112.log
a113.log
aaaaa112.log
aaa113.log
aa112.log
aaa116.log
a113.log
aaaaa116.log
aaa113.log
aa114.log

输出文件:

aaaa116.log
a112.log
aaa112.log
a113.log
aaaaa112.log
aaa113.log
aaa116.log
a113.log

如何通过bash脚本执行此操作?

3 个答案:

答案 0 :(得分:1)

可能awk是最简单的工具。例如,这个单行

tac file | awk 'match($0, /[0-9]{3}.log/,a) && a[0] in b; {b[a[0]]}' | tac

为样本输入生成请求的输出。这不需要将整个文件存储在内存中。

更改正则表达式以满足您的特定需求。

答案 1 :(得分:1)

在不保留订单的情况下删除TextView.setText(String.valueOf(s));中的最后一个匹配行非常简单。

awk

保持有序输出更复杂,需要更多内存。

awk -F'[^0-9]+' '/[0-9]+\.log$/ {
    t = $(NF - 1);
    if (t in a)
        print a[t];
    a[t] = $0;
}'

要在第一个示例中传递不匹配的行,可以将awk -F'[^0-9]+' '/[0-9]+\.log$/ { t = $(NF - 1); a[++i] = $0; b[$0] = t; c[t] = i; } END { for (n = 1; n <= i; n++) if (n != c[b[a[n]]]) print a[n]; }' 语句添加到操作中,并且可以附加next的模式。对于第二个示例,可以将对数组1的赋值移动到自己的操作中。

答案 2 :(得分:1)

$ awk '{k=substr($0,length()-7)} NR==FNR{n[k]=NR;next} FNR!=n[k]' file file
aaaa116.log
a112.log
aaa112.log
a113.log
aaaaa112.log
aaa113.log
aaa116.log
a113.log