如果有一个长度未知的文本文件,例如如何读取除文件前两行以外的所有内容?我知道tail
命令可以给出最后N行,但是我事先不知道N的值。
因此对于一个文件:
AAAA
BBBB
CCCC
DDDD
EEEE
我想要
CCCC
DDDD
EEEE
对于一个文件
AAAA
BBBB
CCCC
我只会得到
CCCC
如果有一个长度未知的文本文件,例如如何读取除文件前两行以外的所有内容?我知道tail
命令可以给出最后N行,但是我事先不知道N的值。
因此对于一个文件:
AAAA
BBBB
CCCC
DDDD
EEEE
我想要
CCCC
DDDD
EEEE
对于一个文件
AAAA
BBBB
CCCC
我只会得到
CCCC
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
将给你你想要的输出(从第三行开始):
tail -n +3
head
来做这件事? - ruakhtail -n +1
等同于 cat
。要获取除第一行之外的所有行,您需要执行 tail -n +2
。 - Lucas Wiman假设您使用的 tail 版本支持,您可以指定从 X 行之后开始查看。在您的情况下,您需要输入 2+1。
tail -n +3
[mdemaria@oblivion ~]$ tail -n +3 stack_overflow.txt
CCCC
DDDD
EEEE
使用 awk 的简单解决方案:
awk 'NR > 2 { print }' file.name
尝试使用sed 1,2d
。根据需要替换数字2。
tail -n +linecount filename
将从 filename
的第 linecount
行开始输出,因此 tail -n +3 filename
应该可以满足您的需求。
tail -n +17 filename
可以。我使用bash/ubuntu LTS。 - isomorphismestail
接受了我在原回答中使用的语法,但现在需要使用显式的 -n
选项。我已相应更新了我的回答。 - Jim Lewis如果第一个样本被称为sample1.dat,那么使用以下命令:tail --lines=3 sample1.dat
,它将打印从第三行到最后一行的所有行。
对于第二个样本,假设它被称为sample2.dat,则使用以下命令:tail --lines=-1 sample2.dat
,它将打印最后一行...
head
函数支持使用负数。
head --help
-n, --lines=[-]K print the first K lines instead of the first 10;
with the leading '-', print all but the last
K lines of each file
head -n +2
AAAA
BBBB
head -n -2
CCCC
DDDD
EEEE
tail
不同的是,这并不需要事先知道文件中总行数。它将排除前两行,无论有多少行。tail -n -2
中的负数同样可用于删除文件的 最后 2 行。我真的不知道如何仅从头或尾部开始完成它,但是通过使用wc -l
(行计数)和bash表达式的帮助,您可以实现这一点。
tail -$(( $( wc -l $FILE | grep -Eo '[0-9]+' ) - 2 )) $FILE
awk 'FNR==NR{n=FNR}FNR<=n-3{print}' file file
使用awk获取除了前两行以外的所有内容
awk 'NR>2' file
或者您可以使用更多的方法
more +2 file
或者只是bash
#!/bin/bash
i=0
while read -r line
do
[[ $i > 1 ]] && echo "$line"
((i++))
done <"file"