Answers:
sed -n '16224,16482p;16483q' filename > newfile
从sed手册中:
p-打印出图案空间(至标准输出)。该命令通常仅与-n命令行选项结合使用。
n-如果未禁用自动打印,请打印图案空间,然后无论如何都要用下一行输入替换图案空间。如果没有更多输入,则sed退出而不处理任何其他命令。
q-退出
sed
而不处理任何其他命令或输入。请注意,如果未使用-n选项禁用自动打印,则会打印当前图案空间。
sed脚本中的地址可以采用以下任何形式:
数 指定行号将匹配输入唯一的那条线。
可以通过指定两个用逗号(,)分隔的地址来指定地址范围。地址范围匹配从第一个地址匹配的行开始,一直持续到第二个地址匹配(包括第二个地址)为止。
sed -n '16224,16482p;16483q' filename
。否则,sed将一直扫描到最后(或者至少是我的版本)。
使用头/尾非常简单:
head -16482 in.sql | tail -258 > out.sql
使用sed:
sed -n '16482,16482p' in.sql > out.sql
使用awk:
awk 'NR>=10&&NR<=20' in.sql > out.sql
tail
。
sed -n 16224,16482p' in.sql >out.sql
awk命令,而awk命令应该为awk 'NR>=16224&&NR<=16482' in.sql > out.sql
head -16482 in.sql | tail -$((16482-16224)) >out.sql
计算工作
tail -n +16224
用来减少计算量
您可以使用“ vi”,然后使用以下命令:
:16224,16482w!/tmp/some-file
或者:
cat file | head -n 16482 | tail -n 258
编辑:-只是为了增加解释,您使用head -n 16482显示前16482行,然后使用tail -n 258从第一个输出中获取最后258行。
cat
命令;head
可以直接读取文件。这比许多替代方法要慢,因为它使用了2个(如图所示为3个)命令,其中1个就足够了。
cat
)从具有500k行的2G文件中提取了200k行,约1G 。其他解决方案至少需要几分钟。而且GNU上最快的变化似乎是tail -n +XXX filename | head XXX
。
还有另一种方法awk
:
awk 'NR==16224, NR==16482' file
如果文件很大,最好exit
读取最后一行。这样,它不会不必要地读取以下行:
awk 'NR==16224, NR==16482-1; NR==16482 {print; exit}' file
awk 'NR==16224, NR==16482; NR==16482 {exit}' file
print; exit
。谢谢 !
awk 'NR==16224, NR==16482; NR==16482 {exit}' file
我编写了一个名为splitter的Haskell程序,该程序正是这样做的:请仔细阅读我的发行博客文章。
您可以按以下方式使用该程序:
$ cat somefile | splitter 16224-16482
这就是全部。您将需要Haskell进行安装。只是:
$ cabal install splitter
您完成了。我希望您觉得这个程序有用。
splitter
只有从标准输入读取?从某种意义上说,没关系;cat
无论是否执行该命令都是多余的。使用splitter 16224-16482 < somefile
或(如果使用文件名参数)splitter 16224-16482 somefile
。
甚至我们也可以在命令行中进行检查:
cat filename|sed 'n1,n2!d' > abc.txt
例如:
cat foo.pl|sed '100,200!d' > abc.txt
cat
命令。sed
完全能够自己读取文件,或者您可以重定向文件中的标准输入。
我编写了一个小的bash脚本,您可以从命令行运行它,只要您更新PATH以包括其目录即可(或者可以将其放置在PATH中已经包含的目录中)。
用法:$捏文件名开始行结束行
#!/bin/bash
# Display line number ranges of a file to the terminal.
# Usage: $ pinch filename start-line end-line
# By Evan J. Coon
FILENAME=$1
START=$2
END=$3
ERROR="[PINCH ERROR]"
# Check that the number of arguments is 3
if [ $# -lt 3 ]; then
echo "$ERROR Need three arguments: Filename Start-line End-line"
exit 1
fi
# Check that the file exists.
if [ ! -f "$FILENAME" ]; then
echo -e "$ERROR File does not exist. \n\t$FILENAME"
exit 1
fi
# Check that start-line is not greater than end-line
if [ "$START" -gt "$END" ]; then
echo -e "$ERROR Start line is greater than End line."
exit 1
fi
# Check that start-line is positive.
if [ "$START" -lt 0 ]; then
echo -e "$ERROR Start line is less than 0."
exit 1
fi
# Check that end-line is positive.
if [ "$END" -lt 0 ]; then
echo -e "$ERROR End line is less than 0."
exit 1
fi
NUMOFLINES=$(wc -l < "$FILENAME")
# Check that end-line is not greater than the number of lines in the file.
if [ "$END" -gt "$NUMOFLINES" ]; then
echo -e "$ERROR End line is greater than number of lines in file."
exit 1
fi
# The distance from the end of the file to end-line
ENDDIFF=$(( NUMOFLINES - END ))
# For larger files, this will run more quickly. If the distance from the
# end of the file to the end-line is less than the distance from the
# start of the file to the start-line, then start pinching from the
# bottom as opposed to the top.
if [ "$START" -lt "$ENDDIFF" ]; then
< "$FILENAME" head -n $END | tail -n +$START
else
< "$FILENAME" tail -n +$START | head -n $(( END-START+1 ))
fi
# Success
exit 0
wc
命令,它两次读取文件,这浪费了磁盘带宽,尤其是在千兆字节文件上。在各种方面,这都有据可查,但它也是工程学的过分杀伤力。
接受答案中的-n起作用。如果您有这种倾向,这是另一种方法。
cat $filename | sed "${linenum}p;d";
这将执行以下操作:
cat file | sed
最好写成sed file
由于我们正在谈论从文本文件中提取文本行,因此我将给出一种特殊情况,即您要提取与特定模式匹配的所有行。
myfile content:
=====================
line1 not needed
line2 also discarded
[Data]
first data line
second data line
=====================
sed -n '/Data/,$p' myfile
将打印[Data]行和其余行。如果要从第1行到模式的文本,请键入:sed -n'1,/ Data / p'myfile。此外,如果您知道两个模式(在文本中最好是唯一的),则可以使用匹配项来指定范围的开始和结束行。
sed -n '/BEGIN_MARK/,/END_MARK/p' myfile