次の行( `+ N`オプション)と頻度( `〜N`)でsed

次の行( `+ N`オプション)と頻度( `〜N`)でsed

私はsedを使って10行(10、11、20、21、30、31、...)ごとに2行のテキストを検索しようとしています。

sed -n '10,11p' file10行と11行の場合、またはを使用できますsed -n '10,+1p' file。範囲(10日、20日、30日、...)の場合sed -n '10,~10p' file。しかし、どういうわけかこの2つを組み合わせることは可能ですか?

sed -n '10,~10,+1p' file動作しません。

重複しているようですが、参照が見つかりません。ありがとうございます!

答え1

ADDR1,ADDR2FIRST~STEPasADDR1+OFFSETasと一緒に使用されますADDR2

$ seq 30 | sed '10~10,+1!d'
10
11
20
21
30

~それにもかかわらず、両方とも+非標準のGNU拡張であることに注意してください。

詳しくはinfo sed 'line selection'GNUシステムをご覧ください。info sed 'range of lines'

POSIXly では以下を使用します。

seq 30 | sed -n '1n;n;n;n;n;n;n;n;n;p;n;p'

答え2

どのような解決策がありますか awk

awk '(FNR>1) && (FNR%10<2)' file
  • FNRはいawk各ファイルのラインカウンタを自動的に更新します。
  • "true"(文字列である可能性がある)と評価される「ルールブロック」()の外側{ ... }のすべての条件は、これまでに行われたすべての修正を含む現在の行を印刷するように指示します。1awk
  • したがって、(FNR>1) && (FNR%10<2)現在の行が最初の行ではなく、行番号が10の倍数(または最大+ 1)の場合、現在の行が印刷されます。これは「10行以下ごと」と同じです。

答え3

awkを使用すると、図のように実行できます。 NR は awk 用語の行番号です。

$ awk 'NR ~ /.[10]$/'  file

sed以下のようにして、10本の改行に達するまで予約済みスペースを増やすことができます。

$ sed -nE 'x
  /\n{9}/{
    z;x;$d
    N;p;D
  }
  s/$/\n/;h
' file
$ perl -ne '$.%10||print($_.<>)' file

関連情報