从文件中读取指定范围的行


15

我有一个包含100000行的文件,如何在Linux下从5555行到7777行。

谢谢大家

linux  files  sed 

1
@ibrahim,请考虑接受Kyle的回答(在左边的绿色对号上打勾),如果有帮助,则可以解决
Jonik 2010年

如果您要使用sed或其他工具还可以,则可能会更精确。
Manu H

Answers:


22
sed '5555,7777!d' <filename>

这将打印文件的5555-7777行。

丹尼斯发表了以下内容,我同意应该更快:

sed '5555,7777p; 7778q' filename

以下证据表明它应该更快:

$ n=1
$ while [[ n -le 100000 ]]; do echo $n >> sedtest2; n=$((n + 1)); done
$ strace -e trace=read -o sed1 sed '5555,7777!d' sedtest2
$ strace -e trace=read -o sed2 sed '5555,7777p; 7778q' sedtest2
$ wc -l sed1
149 sed1
$ wc -l sed2
14 sed1

仅在Bash中(出于娱乐目的):

n=1
while read line; do 
    if [[ ($n -ge 5555) && ($n -le 7777)  ]]; then 
        echo $line
    elif [[ $n -gt 7777 ]]; then
        break
    fi 
    n=$(( $n + 1 ))
done < file

我认为您$n -gt 3应该是7777?此外,您还可以if (( n >= 5555 ))使用更具“自然”外观的数字比较运算符(以及省略美元符号的功能)。而且你可以做到((n++))
暂停,直到另行通知。


7

这些都应该起作用;

  • sed -n' 起始编号终止编号 p'
  • awk'NR > = 起始编号 && NR <= 终止编号 '文件

顺便问一个好问题;)


1

我发现sed选项在mysqldump文件上不起作用,我猜是由于对引号引起来的换行或多字节字符的处理。头部和尾部使用与grep相同的行号对其进行切片,这正是我所需要的。要获得从$ j到$ k的行,您需要:

x=$(( $k - $j + 1 ))
tail -n +$j filename | head -${x} 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.