我有一个非常长的文件要打印,例如跳过前1,000,000行。
我查看了cat man页面,但我没有看到任何这样做的选项。我正在寻找一个命令来执行此操作或一个简单的Bash程序。
你需要尾巴。一些例子:
$ tail great-big-file.log < Last 10 lines of great-big-file.log >
如果您确实需要跳过特定数量的“第一”行,请使用
$ tail -n +<N+1> <filename> < filename, excluding first N lines. >
也就是说,如果要跳过N行,则从第N+1行开始打印。示例:
$ tail -n +11 /tmp/myfile < /tmp/myfile, starting at line 11, or skipping the first 10 lines. >
如果您只想看到最后这么多行,请省略“+”:
$ tail -n <N> <filename> < last N lines of file. >
您可以使用head和ail命令执行此操作:
head -n <num> | tail -n <lines to print>
其中num是1e6+要打印的行数。
如果您的系统上有可用的GNU尾巴,您可以执行以下操作:
tail -n +1000001 huge-file.log
它是+字符,可以做您想做的事情。引用手册页:
+
如果K的第一个字符(字节或行数)是 '+',从每个文件的开头以第K项开始打印。
因此,正如注释所指出的,put+1000001在第一个1,000,000行之后开始打印第一个项目。
这个外壳脚本对我来说很好:
#!/bin/bash awk -v initial_line=$1 -v end_line=$2 '{ if (NR >= initial_line && NR <= end_line) print $0 }' $3
与此示例文件一起使用(file.txt):
one two three four five six
命令(它将从文件中的第二行到第四行提取):
edu@debian5:~$./script.sh 2 4 file.txt
此命令的输出:
two three four
当然,你可以改进它,例如通过测试所有参数值都是预期的:-)
我需要做同样的事情,并找到了这个线程。
我尝试了“ail-n+”,但它只是打印了所有内容。
更多+行在提示符上工作得很好,但事实证明,当在无头模式下运行(cronwork)时,它的行为完全不同。
最后我自己写了这个:
skip=5 FILE="/tmp/filetoprint" tail -n$((`cat "${FILE}" | wc -l` - skip)) "${FILE}"
只是为了提出一个sed替代方案。:)要跳过前一百万行,请尝试|sed '1,1000000d'。
sed
|sed '1,1000000d'
示例:
$ perl -wle 'print for (1..1_000_005)'|sed '1,1000000d' 1000001 1000002 1000003 1000004 1000005
我发现删除文件前十行的最简单方法:
$ sed 1,10d file.txt
在一般情况下,X是要删除的初始行数,这要归功于评论者和编辑:
X
$ sed 1,Xd file.txt
cat < File > | awk '{if(NR > 6) print $0}'
如果你想看到前10行,你可以使用se如下:
sed -n '1,10 p' myFile.txt
或者,如果您想查看20到30行,您可以使用:
sed -n '20,30 p' myFile.txt
使用AWK的较少冗长版本:
awk 'NR > 1e6' myfile.txt
但我建议使用整数。
如果你想跳过前两行:
tail -n +3 <filename>
如果你想跳过第一行:
tail -n +$((x+1)) <filename>
将Seddelete命令与范围地址一起使用。例如:
delete
sed 1,100d file.txt # Print file.txt omitting lines 1-100.
或者,如果您只想打印已知范围,请使用带有-n标志的打印命令:
-n
sed -n 201,300p file.txt # Print lines 201-300 from file.txt
该解决方案应该在所有Unix系统上可靠地工作,无论是否存在GNU实用程序。
用途:
sed -n '1d;p'
此命令将删除第一行并打印其余部分。