好吧所以这里尾我与这个AWK代码至极挣扎应该效仿tail命令实现与AWK
num=$1;
{
vect[NR]=$0;
}
END{
for(i=NR-num;i<=NR;i++)
print vect[$i]
}
所以我想在这里实现是AWK 例如模拟的tail命令考虑cat somefile | awk -f tail.awk 10 应该打印文本文件的最后10行,有什么建议吗?
好吧所以这里尾我与这个AWK代码至极挣扎应该效仿tail命令实现与AWK
num=$1;
{
vect[NR]=$0;
}
END{
for(i=NR-num;i<=NR;i++)
print vect[$i]
}
所以我想在这里实现是AWK 例如模拟的tail命令考虑cat somefile | awk -f tail.awk 10 应该打印文本文件的最后10行,有什么建议吗?
for(i=NR-num;i<=NR;i++)
print vect[$i]
$
表示位置参数。使用只是普通i
:
for(i=NR-num;i<=NR;i++)
print vect[i]
为我工作的完整代码是:
#!/usr/bin/awk -f
BEGIN{
num=ARGV[1];
# Make that arg empty so awk doesn't interpret it as a file name.
ARGV[1] = "";
}
{
vect[NR]=$0;
}
END{
for(i=NR-num;i<=NR;i++)
print vect[i]
}
你应该有些代码可能添加到END
处理时NR
< num
的情况。
当我尝试将文本文件转换为awk时,我仍然在ARGV [1 ] ------------------------------------------------ ----------- cat test1.txt | awk -f tailawk 10 – 2012-02-01 18:46:23
认为我已经添加了一个BEGIN {num = ARGV [1]} – 2012-02-01 18:47:33
您需要将-v num=10
添加到awk命令行以设置值num
。在你的最终循环中从NR-num+1
开始,否则你将以num+1
行输出结束。
是thx我忘了增加nr-num,因为我试过从nr向后读取nr-num并交换索引和忘记增加,thx无论如何 – 2012-02-01 19:45:09
这可能会为你工作:
awk '{a=a b $0;b=RS;if(NR<=v)next;a=substr(a,index(a,RS)+1)}END{print a}' v=10
如果解释了我会赞成这个。我能理解它,但它需要每个人的解释。 – Camusensei 2015-09-23 11:22:32
所有这些答案的存储整个源文件。这是一个可怕的想法,并会打破更大的文件。
这里仅存储的行数的快速方式输出(注意,更高效tail
总是会更快,因为它不读取整个源文件!):
awk -vt=10 '{o[NR%t]=$0}END{i=(NR<t?0:NR);do print o[++i%t];while(i%t!=NR%t)}'
更多清晰(并且具有较少code golf):的易读代码
awk -v tail=10 '
{
output[NR % tail] = $0
}
END {
if(NR < tail) {
i = 0
} else {
i = NR
}
do {
i = (i + 1) % tail;
print output[i]
} while (i != NR % tail)
}'
说明:
这使用modulo operator到只存储所需数量的项目(tail
变量)。由于每行都被解析,所以它被存储在较旧的数组值的上面(所以第11行被存储在output[1]
中)。
END
节将增量变量i
设置为零(如果我们得到的数量少于所需的行数)或者行数,它告诉我们从哪里开始调用已保存的行。然后我们按顺序打印保存的行。当我们返回到第一个值时(在我们打印完它之后),循环结束。
,可随时更换if
/else
节(或在我的golfed例如ternary clause)只i = NR
如果你不关心让空行,以填补请求数量(echo "foo" |awk -vt=10 …
必须与线九点前空行“富”)。
'awk -f tail.awk num = 10',10本身将被解释为文件名。祝你好运。 – shellter 2012-02-01 18:45:51
你真的需要存储整个文件吗? – Johnsyweb 2012-02-01 18:56:35
@Johnsyweb好吧,但这是我想用的方法,还有一些其他的想法?免费下载:) – 2012-02-01 19:46:07