私はsedを使って10行(10、11、20、21、30、31、...)ごとに2行のテキストを検索しようとしています。
sed -n '10,11p' file
10行と11行の場合、またはを使用できますsed -n '10,+1p' file
。範囲(10日、20日、30日、...)の場合sed -n '10,~10p' file
。しかし、どういうわけかこの2つを組み合わせることは可能ですか?
sed -n '10,~10,+1p' file
動作しません。
重複しているようですが、参照が見つかりません。ありがとうございます!
答え1
ADDR1,ADDR2
FIRST~STEP
asADDR1
と+OFFSET
asと一緒に使用されます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"(文字列である可能性がある)と評価される「ルールブロック」()の外側
{ ... }
のすべての条件は、これまでに行われたすべての修正を含む現在の行を印刷するように指示します。1
awk
- したがって、
(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