如何自动忽略文件的最后三行?

时间:2013-08-15 16:14:53

标签: bash solaris

我使用以下命令:

 head -36 file.txt > file1.txt

文件是39行,但事实是我正在检查文件是39行,所以将数字36放在注释中。那么有一种方法,命令计算行数并扣除最后3行?

5 个答案:

答案 0 :(得分:3)

awk -v nr=$(wc -l <file) 'NR<(nr-2)' file

答案 1 :(得分:2)

nl=`wc -l file.txt | awk 's=$1-3{print s}'`; head -n $nl file.txt

wc -l计算总行数。使用awk,您可以打印总行数-3。然后使用head只读取那么多行...

答案 2 :(得分:1)

这是awk唯一的解决方案(没有流程替换,管道等)

awk 'NR==FNR{k++;next}FNR<=k-3' file.txt file.txt

说明:

  • 我们将file.txt添加两次,以便awk读取两次。第一次计算文件中的总行数,第二次打印所有行,除了最后三行
  • NR==FNR{k++;next}NR变量是记录号(包括两个文件),FNR是当前文件中的记录号。它们仅对第一个文件中的记录相同。因此,对于第一个文件,我们使用k++计算其中的行,然后我们使用next跳过剩余的命令。
  • FNR<=k-3如果FNR变量小于文件中的总行数(我们在上一个项目符号中计算) - 3,则表达式的计算结果为true,并打印该行。否则,表达式的计算结果为false(对于最后三行),并且不打印该行。这只发生在第二个文件中,因为前一个块中有next命令。

答案 3 :(得分:0)

嘿,你想告诉它要排除多少行,而不是你最终会有多少行。

同时添加-n以检查空文件。

head -n -3 file.txt

<小时/> 如果没有尝试使用临时文件

head -n -3 file.txt > temp.txt ; mv temp.txt file.txt

答案 4 :(得分:-1)

这应该有效

head -n -3 file.txt

来自man head

 -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