我想为每个可能的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脚本执行此操作?
答案 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