sun*_*nil 29 sed tail text-processing head
我有 200 行的文件。
我需要从 10 到 100 中提取行并将它们放入一个新文件中。
你如何在 unix/Linux 中做到这一点?
您可以使用哪些可能的命令?
Mic*_*mer 56
使用sed:
sed -n -e '10,100p' input.txt > output.txt
Run Code Online (Sandbox Code Playgroud)
sed -n
意味着默认情况下不打印每一行。-e
表示将下一个参数作为 sed 脚本执行。10,100p
是一个 sed 脚本,这意味着从第 10 行开始,直到第 100 行(包括),打印 ( p
) 该行。然后将输出保存到output.txt
.
如果你的文件比建议的长,这个版本(在评论中建议)会更快:
sed -e '1,9d;100q'
Run Code Online (Sandbox Code Playgroud)
这意味着删除第 1-9 行,在第 100行后退出,并打印其余部分。对于 200 行,这无关紧要,但对于 200,000 行,第一个版本仍然会查看每一行,即使它永远不会打印它们。我一般更喜欢第一个版本,因为它是明确的,但是对于长文件,这会更快——你最了解你的数据。
或者,您可以使用head
和tail
组合使用:
tail -n +10 input.txt | head -n 91 > output.txt
Run Code Online (Sandbox Code Playgroud)
这次,tail -n +10
从第 10 行开始打印整个文件,并head -n 91
打印前 91 行(直到并包括原始文件的第 100 行)。它以output.txt
相同的方式重定向到。
如果您要在 中执行此操作vim
,那将非常简单。假设您的文件已命名,src
并且您希望将行移动到的文件是dest
. 如果dest
尚不存在,您将创建它:
touch dest
Run Code Online (Sandbox Code Playgroud)
然后,打开两个src
和dest
中vim
(该-p
标志打开论点选项卡):
vim -p src dest
Run Code Online (Sandbox Code Playgroud)
跳到第十行;选择从第 10 行到第 100 行的所有内容;猛拉;切换到包含dest
;的选项卡 粘贴。
10ggv101ygtp
Run Code Online (Sandbox Code Playgroud)
注意:101
选择到第 101 行的开头(在第\n
100 行的末尾捕获)。
与使用命令行工具相比,这显然是一个更复杂的过程,但确实具有为您提供视觉选择的优势(因此您可以确保获得所需的一切)。然而,这似乎也是一个很好的用例awk
:
awk 'NR==10, NR==100' src > dest
Run Code Online (Sandbox Code Playgroud)
该NR
变量允许您根据行数进行模式匹配。因此,上面的命令从中提取第 10-100 行src
,然后您的 shell 将输出重定向到dest
.