Ada*_*ter 505 unix command-line text-processing sed
我有一个~23000行的SQL转储包含几个数据库的数据.我需要提取此文件的某个部分(即单个数据库的数据)并将其放在一个新文件中.我知道我想要的数据的起始行和结束行号.
有没有人知道一个Unix命令(或一系列命令)从第16224和16482行之间的文件中提取所有行,然后将它们重定向到一个新文件?
小智 750
sed -n '16224,16482p;16483q' filename > newfile
Run Code Online (Sandbox Code Playgroud)
从sed手册:
p - 打印出图案空间(到标准输出).此命令通常仅与-n命令行选项一起使用.
n - 如果未禁用自动打印,则打印图案空间,然后,无论如何,将图案空间替换为下一行输入.如果没有更多输入,那么sed退出而不再处理任何命令.
q - 退出
sed
而不处理更多命令或输入.请注意,如果未使用-n选项禁用自动打印,则会打印当前模式空间.
sed脚本中的地址可以采用以下任何一种形式:
number 指定行号仅匹配输入中的该行.
可以通过指定用逗号(,)分隔的两个地址来指定地址范围.地址范围匹配从第一个地址匹配的行开始,并继续直到第二个地址匹配(包含).
JXG*_*JXG 199
sed -n '16224,16482 p' orig-data-file > new-file
Run Code Online (Sandbox Code Playgroud)
16224,16482是起始行号和结束行号,包括在内.这是1索引的. -n
抑制将输入作为输出回显,这显然是你不想要的; 数字表示使以下命令操作的行数范围; 该命令p
打印出相关的行.
man*_*eru 86
使用头/尾非常简单:
head -16482 in.sql | tail -258 > out.sql
Run Code Online (Sandbox Code Playgroud)
使用sed:
sed -n '16482,16482p' in.sql > out.sql
Run Code Online (Sandbox Code Playgroud)
使用awk:
awk 'NR>=10&&NR<=20' in.sql > out.sql
Run Code Online (Sandbox Code Playgroud)
小智 30
您可以使用'vi'然后使用以下命令:
:16224,16482w!/tmp/some-file
Run Code Online (Sandbox Code Playgroud)
或者:
cat file | head -n 16482 | tail -n 258
Run Code Online (Sandbox Code Playgroud)
编辑: - 只是添加说明,你使用head -n 16482显示第一个16482行然后使用tail -n 258来获得第一个输出中的最后258行.
fed*_*qui 25
还有另一种方法awk
:
awk 'NR==16224, NR==16482' file
Run Code Online (Sandbox Code Playgroud)
如果文件很大,那么exit
在读完最后一行后可能会很好.这样它就不会不必要地读取文件直到最后:
awk 'NR==16224, NR==16482-1; NR==16482 {print; exit}' file
Run Code Online (Sandbox Code Playgroud)
Tas*_*nou 19
人们试图绞尽脑汁计算一个间隔head | tail
组合的间隔是想太多了。
以下是无需计算任何内容即可获得“16224 - 16482”范围的方法:
cat file | head -n +16482 | tail -n +16224
Run Code Online (Sandbox Code Playgroud)
解释:
指示/+
命令“向上/从”(分别)指定的行号(从文件开头算起)。head
tail
类似地, a-
指示它们“分别”从文件末尾开始计算指定的行号
上面显示的解决方案简单地使用head
第一个“将所有内容保留到顶部数字”,然后使用tail
第二个“保留从底部数字向上的所有内容”,从而定义我们感兴趣的范围(无需计算间隔)。
小智 17
perl -ne 'print if 16224..16482' file.txt > new_file.txt
Run Code Online (Sandbox Code Playgroud)
# print section of file based on line numbers
sed -n '16224 ,16482p' # method 1
sed '16224,16482!d' # method 2
Run Code Online (Sandbox Code Playgroud)
cat dump.txt | head -16224 | tail -258
Run Code Online (Sandbox Code Playgroud)
应该做的伎俩.这种方法的缺点是你需要做算术来确定尾部的参数,并考虑你是否希望'between'包括结束行.
我站在Boxxar的肩膀上,像这样:
sed -n '<first line>,$p;<last line>q' input
Run Code Online (Sandbox Code Playgroud)
例如
sed -n '16224,$p;16482q' input
Run Code Online (Sandbox Code Playgroud)
的$
意思是“最后行”,所以第一个命令使sed
打印开始的行中的所有行16224
和所述第二命令使sed
退出后打印线16428
。(添加1
为q
在boxxar的解决方案-范围似乎没有必要。)
我喜欢这种变体,因为我不需要两次指定结束行号。而且我测量到使用$
不会对性能产生不利影响。
归档时间: |
|
查看次数: |
461596 次 |
最近记录: |