由于未知长度的文本文件,我怎么能读,例如所有,但第2行的文件?我知道tail最后N行会给我,但我不知道N会提前多少。
所以对于一个文件
AAAA
BBBB
CCCC
DDDD
EEEE
我想要
CCCC
DDDD
EEEE
和一个文件
AAAA
BBBB
CCCC
我会得到
CCCC
由于未知长度的文本文件,我怎么能读,例如所有,但第2行的文件?我知道tail最后N行会给我,但我不知道N会提前多少。
所以对于一个文件
AAAA
BBBB
CCCC
DDDD
EEEE
我想要
CCCC
DDDD
EEEE
和一个文件
AAAA
BBBB
CCCC
我会得到
CCCC
Answers:
tail --help 给出以下内容:
-n, --lines=K output the last K lines, instead of the last 10;
or use -n +K to output lines starting with the Kth
因此,要过滤掉第一2行,-n +3应该为您提供所需的输出(从3rd开始)。
head此功能?
使用awk的简单解决方案:
awk 'NR > 2 { print }' file.name
{ print }是默认操作,可以省略。
使用此方法,假设第一个样本名为sample1.dat,那么tail --lines=3 sample1.dat它将打印从第三行到最后一行的所有行。
对于第二个示例,再次假设它名为sample2.dat tail --lines=-1 sample2.dat,它将打印最后一行...
tail +3 anyfile给出一般情况下的期望结果,而tail --lines=N需要事先知道N才能给出期望的结果。
tail……“ 自下而上”吗?(Ba-dum TISH!谢谢,我将整周待在这里...)
我真的不知道该如何从尾巴或头做,但是借助wc -l(行数)和bash表达式,您可以实现。
tail -$(( $( wc -l $FILE | grep -Eo '[0-9]+' ) - 2 )) $FILE
希望这可以帮助。
使用awk获取除最后两行以外的所有内容
awk 'FNR==NR{n=FNR}FNR<=n-3{print}' file file
awk获取除前2行外的所有内容
awk 'NR>2' file
或者您可以使用更多
more +2 file
或只是重击
#!/bin/bash
i=0
while read -r line
do
[[ $i > 1 ]] && echo "$line"
((i++))
done <"file"