我有 200 行的文件。
我需要提取 10 到 100 行并将它们放入一个新文件中。
在 UNIX/Linux 中如何做到这一点?
您可以使用哪些可能的命令?
答案1
使用sed:
sed -n -e '10,100p' input.txt > output.txt
sed -n
方法不默认打印每一行。-e
表示将下一个参数作为 sed 脚本执行。10,100p
是一个 sed 脚本,意味着从第 10 行开始,直到第 100 行(含),打印 ( p
) 该行。然后输出保存到output.txt
.
如果您的文件比建议的长,这个版本(评论中建议的)会更快:
sed -e '1,9d;100q'
这意味着删除第 1-9 行,辞职第 100 行之后,打印其余部分。对于 200 行来说,这并不重要,但对于 200,000 行,第一个版本仍然会查看每一行,即使它永远不会打印它们。一般来说,我更喜欢第一个版本,因为它很明确,但对于长文件,这会快得多——你最了解你的数据。
或者,您可以组合使用head
和:tail
tail -n +10 input.txt | head -n 91 > output.txt
这次,tail -n +10
从第 10 行开始打印整个文件,并head -n 91
打印其中的前 91 行(直到原始文件的第 100 行)。它output.txt
以相同的方式重定向到。
答案2
这应该做
tail -n +10 file.txt | head -n 91 > newfile.txt
答案3
如果你要在 中执行此操作vim
,那就非常简单了。假设您的文件已命名src
,并且您希望将行移动到的文件是dest
.如果dest
尚不存在,您将创建它:
touch dest
然后,打开src
和dest
in vim
(该-p
标志在选项卡中打开参数):
vim -p src dest
跳转到第十行;选择从第 10 行到第 100 行的所有内容;猛拉;切换到包含dest
;的选项卡粘贴。
10ggv101ygtp
笔记:101
选择到第 101 行的开头(捕获\n
第 100 行末尾的 )。
这显然是比使用命令行工具更复杂的过程,但确实具有为您提供视觉选择的优点(因此您可以确保获得您想要的一切)。然而,这似乎也是一个很好的用例awk
:
awk 'NR==10, NR==100' src > dest
该NR
变量允许您根据行数进行模式匹配。因此,上面的命令会从中提取第 10-100 行src
,然后 shell 将输出重定向到dest
.
答案4
您可以通过多种方式做到这一点。
解决方案awk
:
$ awk 'NR<10{next};1;NR>100{exit}' file > new_file
一个perl
办法:
$ perl -nle '
print if $. > 9 and $. < 101;
exit if $. > 100;
' file > new_file