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

问题描述 投票:0回答:6

我正在使用以下命令:

 head -36 file.txt > file1.txt

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

bash solaris
6个回答
3
投票
awk -v nr=$(wc -l <file) 'NR<(nr-2)' file

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

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


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,则表达式的计算结果为真,并打印该行。否则,表达式的计算结果为 false(对于最后三行),并且不打印该行。这只发生在第二个文件中,因为前一个块中的
    next
    命令。

0
投票

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

还添加

-n
以检查空文件。

head -n -3 file.txt


如果不尝试使用临时文件

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

0
投票

这是一个纯粹的基于

awk
的解决方案,不使用
wc
head
tail
或任何跟踪阵列

  • 1.85 GB
    完成了一个
    2.456 seconds
  • 文件

可能比

wc -l
方法慢一点点,但是这个方法适用于通过管道的项目以及中间有空行的文件。

因此,只要您的数据输入小于,比如说,

2.5 GB
,不妨一次性完成,而不是“惯用方式”

 __="${m3t}"
 pvE0 < "$__" | wc5

 sleep 2

 ( time ( pvE0 < "$__" | 

   mawk2 'BEGIN { FS = OFS = RS
                             RS = "^$" 
                     _+=_^= ORS =  "" 

         } _^_ <= NF && NF -= _^("" == $NF)+_' 

 ) | pvE9 ) | wc5

 sleep 2

 ( time ( pvE0 < "$__" | mawk2 '…' ) | pvE9 ) | xxh128sum

      in0: 1.85GiB 0:00:13 [ 143MiB/s] [ 143MiB/s][===========>] 100%
        
rows = 12494275. | UTF8 chars = 1285316715. | bytes = 1983544693.


      in0:  322MiB 0:00:00 [3.15GiB/s] [3.15GiB/s] [====> ] 17% ETA 0:00:00
     out9: 1.85GiB 0:00:15 [ 125MiB/s] [ 125MiB/s] [ <=>               ]
      in0: 1.85GiB 0:00:00 [3.26GiB/s] [3.26GiB/s] [============>] 100%            
( pvE 0.1 in0 < "$__" | mawk2 ; )
       0.71s user 1.48s system 14% cpu 15.032 total

rows = 12494272. | UTF8 chars = 1285314823. | bytes = 1983539445.


      in0:  330MiB 0:00:00 [3.23GiB/s] [3.23GiB/s] [====> ] 17% ETA 0:00:00
     out9: 1.85GiB 0:00:02 [ 774MiB/s] [ 774MiB/s] [ <=> ]
      in0: 1.85GiB 0:00:00 [3.23GiB/s] [3.23GiB/s] [=========>] 100%  
      
( pvE 0.1 in0 < "$__" | mawk2 ; )

 0.71s user 1.46s system 88% cpu 2.456 total

45f50e894dae5cefcf3acc47fc402219  stdin

-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
© www.soinside.com 2019 - 2024. All rights reserved.