ファイルから指定された範囲の行を読み取ります


15

Linuxでline#5555からline#7777までの行を取得する方法は100000行です。

全てに感謝。

linux  files  sed 

1
@ibrahim、それがあなたを助けたなら、カイルの答えを受け入れることを検討してください(左側の緑のチェックマークにチェックを入れることによって)
Jonik

sedを使用したい場合、または他のツールで問題ない場合は、正確な場合があります。
マヌーH

少々の研究が少なくともstackoverflow.com/questions/83329/を

回答:


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 ' startnumberendnumber p'
  • awk 'NR> = 開始番号 && NR <= 終了番号 'ファイル

ところで大きな質問;)


1

mysqldumpファイルではsedオプションが機能しないことがわかりました。引用符付きのラインフィードまたはマルチバイト文字の処理が原因であると推測しています。grepと同じ行番号を使用して、ヘッドとテールをスライスしました。これは必要なものでした。行$ jから$ kを取得するには、以下が必要です。

x=$(( $k - $j + 1 ))
tail -n +$j filename | head -${x} 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.