gpt4 book ai didi

awk 打印文件的倒数第二条记录

转载 作者:行者123 更新时间:2023-12-04 19:13:00 27 4
gpt4 key购买 nike

我有一个文件设置如下

Words on 
many line
%
More Words
on many lines
%
Even More Words
on many lines
%

我想输出该文件的倒数第二条记录,其中记录由 % 分隔。在每个文本块之后。

我用过了:
awk -v RS=\% ' END{ print NR }' $f

查找记录数 (1136)。然后我做了
awk -v RS=\% ' { print $(NR-1) }' $f


awk -v RS=\% ' { print $(NR=1135) }' $f

.
这些都不起作用,而是在文件开头显示一条记录和许多空行。
输出:
"You know, of course, that the Tasmanians, who never committed adultery, are
now extinct."
-- M. Somerset Maugham


"The
is
what
that



这个输出有很多很多空行,并且在文件中间附近包含一条记录。
awk -v RS=\% 'END{ print $(NR-1) }' $f

返回一个空行。相同命令不同 $(NR-x) values 也返回一个空行。

在这种情况下,有人可以帮我打印倒数第二个记录吗?
谢谢

最佳答案

你可以做:

awk '{this=last;last=$0} END{print this}' file

或者,如果您不介意将整个文件保存在内存中:
awk '{a[NR]=$0} END{print a[NR-1]}' file

或者,如果它只是基于行数(或记录数),您可以保持滚动删除,这样您就不会对内存过于吝啬:
$ seq 999999 | tail -2
999998
999999
$ seq 999999 | awk '{a[NR]=$0; delete a[NR-3]} END{print a[NR-1]}'
999998

如果它们是文本块,如果您可以将这些块分成分隔记录,则相同的方法也有效。

鉴于:
$ echo "$txt" 
Words on
many line
%
More Words
on many lines
%
Even More Words
on many lines
%

你可以做:
$ echo "$txt" | awk -v RS=\% '{a[NR]=$0} END{print a[NR-1]}'

Even More Words
on many lines

$ echo "$txt" | awk -v RS=\% '{a[NR]=$0} END{print a[NR-2]}'

More Words
on many lines

如果您不想打印前导和尾随 \n你可以做:
$ echo "$txt" | awk 'BEGIN{RS="%\n"} {a[NR]=$0} END{printf a[NR-2]}'
Words on
many line

最后,如果您知道要打印的特定记录,请在 awk 中这样做:
$ seq 999999 | awk -v mrk=1135 'NR==mrk{print; exit}'
1135

如果你想要一个随机记录,你可以这样做:
$ awk -v min=1 -v max=1135 'BEGIN{srand() 
RS="%\n"
tgt=int(min+rand()*(max-min+1))
}
NR==tgt{print; exit}' file

关于awk 打印文件的倒数第二条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40952412/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com