1

我正在使用以下命令:

 head -36 file.txt > file1.txt

其中文件是 39 行,但问题是我正在检查文件是 39 行,因此将数字 36 放在注释中。那么有没有一种方法可以让命令计算行数并减去最后 3 行?

4

5 回答 5

3
awk -v nr=$(wc -l <file) 'NR<(nr-2)' file
于 2013-08-15T16:39:14.507 回答
2
nl=`wc -l file.txt | awk 's=$1-3{print s}'`; head -n $nl file.txt

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

于 2013-08-15T16:32:18.953 回答
1

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

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

解释:

  • 我们将 file.txt 添加了两次,这样 awk 就会读取它两次。第一次计算文件中的总行数,第二次打印除最后三行之外的所有行
  • NR==FNR{k++;next}:NR变量是记录号(包括两个filee),FNR是当前文件中的记录号。它们仅对第一个文件中的记录相等。因此,对于第一个文件,我们用 计算其中的行数,k++然后用 跳过剩余的命令next
  • FNR<=k-3如果FNR变量小于文件中的总行数(我们在上一个项目符号中计算) - 3,则表达式计算为真,并打印该行。否则,表达式的计算结果为假(对于最后三行),并且不打印该行。next由于前一个块中的命令,这只发生在第二个文件中。
于 2013-08-15T16:49:40.933 回答
0

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

还要添加-n以检查空文件。

head -n -3 file.txt


如果不尝试使用临时文件

head -n -3 file.txt > temp.txt ; mv temp.txt file.txt
于 2013-08-15T16:22:53.903 回答
-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
于 2013-08-15T16:19:52.267 回答