行番号を含むファイルの行範囲を印刷します。

行番号を含むファイルの行範囲を印刷します。

sedファイルの複数行を印刷するオネライナーがあります。

sed -n '10,20p' file.txt

上記のコードは、file.txtの10行から20行まで印刷します。

しかし、行番号をどのように印刷できますか?

答え1

努力するawk

awk 'FNR==10,FNR==20 {print FNR ":" $0}' file.txt

これにより、行番号、コロン、および10〜20の範囲の行が印刷されます。

または20行目以降の読み取りを停止します。

awk 'FNR >= 10 {print FNR ":" $0}; FNR == 20 {exit}' file.txt

複数のファイルを処理し、実装がawkこのディレクティブをnextfileサポートしている場合:

awk -v OFS=: 'FNR >= 10 {print FILENAME, FNR, $0}; FNR == 20 {nextfile}' ./*.txt

(現在のファイル名もここに印刷されます。)

答え2

sed=行番号を出力する命令があります。

sed -n '10,20{=;p}' file.txt

ただし、実際の行の上に別の行に行番号を印刷します。

実際の行と同じ行に行番号が必要な場合は、パイプを使用できますnl到着するsed

nl file.txt | sed -n '10,20p'

nlより良い出力を得るには、いくつかのフラグを設定する必要があります。数字と行の区切り記号、数字の右揃えなどalias nl='nl -b a -n rz -s "|" -w1'で使用できるようにエイリアスを指定しました。|

答え3

のみ使用してくださいsed

sed -n '10,20{=;p}' file.txt | sed '{N; s/\n/ /}'
  • N;sedパターン空間に次の行を追加するように指示するので、sedこれらの2行が処理されています。
  • s/\n/ /改行文字をスペースに置き換えて、2行を「マージ」します。

源泉:

記述子アラ・アリ(ソース2)

答え4

$ < file grep -ne '^' | sed -ne '10,20p'

$ < file sed -e '10,20!d;=;20q' | paste -d: - -

Not so UUOC:
$ cat -n file | sed -nEe '10,20s/^\s*(\S+)\t/\1:/p'

$ perl -lne 's/^/$.:/;
    print if 10..20;
    last  if 20..20;
' file 

関連情報