我正在使用以下命令:
head -36 file.txt > file1.txt
文件是 39 行,但问题是我正在检查文件是否是 39 行,因此将数字 36 放在注释中。那么有没有一种方法可以让命令计算行数并扣除最后 3 行?
awk -v nr=$(wc -l <file) 'NR<(nr-2)' file
nl=`wc -l file.txt | awk 's=$1-3{print s}'`; head -n $nl file.txt
wc -l
计算总行数。使用awk,您可以打印总行数-3
。然后使用head
只读那么多行...
这里是 awk 唯一的解决方案(没有进程替换、管道等)
awk 'NR==FNR{k++;next}FNR<=k-3' file.txt file.txt
说明:
NR==FNR{k++;next}
:NR
变量是记录号(包括两个文件),FNR
是当前文件中的记录号。它们仅对第一个文件中的记录相等。因此,对于第一个文件,我们使用 k++
计算其中的行数,然后我们使用 next
跳过剩余的命令。FNR<=k-3
如果 FNR
变量小于文件中的总行数(我们在上一个项目符号中计算过)- 3,则表达式的计算结果为真,并打印该行。否则,表达式的计算结果为 false(对于最后三行),并且不打印该行。这只发生在第二个文件中,因为前一个块中的 next
命令。嘿,你想告诉它要排除多少行,而不是你最终会得到多少行。
还添加
-n
以检查空文件。
head -n -3 file.txt
head -n -3 file.txt > temp.txt ; mv temp.txt file.txt
这是一个纯粹的基于
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
这应该有效
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