ファイルの最初と最後の空でない(または空白ではない)行を印刷します。

ファイルの最初と最後の空でない(または空白ではない)行を印刷します。

ファイルから空でないか空白ではない最初と最後の行を印刷したいと思います。可能であれば、またはsedを使用してくださいawk

  • 入力ファイル:
    123 345
    456 087
    er 56
    32 78
    
    
    その後に空白行があります32 78
  • 希望の出力:
    123 345
    32 78
    

ベストアンサー1

質問のテキストが修正されたので、ここで両方の質問に答えています。

  1. ファイルの最初の行と2番目の行をどのように出力しますか(元の質問には「2行目」という用語が含まれています)。

  2. null以外の空白ではなく、最初と最後の行をどのように出力しますか?


エディタを使用すると、行のedアドレス指定率がやや柔軟になりますsed。これは、主に一度に1行ではなくすべてのデータがメモリに読み込まれるためです。

$ printf '%s\n' 1p '$-1p' Q | ed -s file
123 345
32 78

終了する前に、入力ファイルの最初の行と2番目の行から最後の行まで印刷されます。 2行目はアドレス指定に使用され、$-1に短縮できます$-

最後に空白行があるかどうかわからない場合は、1行目から逆に検索して内容を含む行を見つけて印刷できます。

$ printf '%s\n' 1p '?[[:graph:]]?p' Q | ed -s file
123 345
32 78

使用sed:

$ sed -n -e 1p -e '${ g; p; }' -e h file
123 345
32 78

これはまず各ラインのデフォルト出力をオフにします-n。次に、最初の行を印刷します。すべての行はsave to Reserved spaceを使用しh、最後の行ではgそれを使用して予約済みスペースを取得して印刷します。最後の2つの式の順序により、2番目から最後の行まで印刷されます。

少しだけ変更すると、2行目かどうかにかかわらず、空でない最後の行を出力するように変更できます。

$ sed -n -e 1p -e '/[[:graph:]]/h' -e '${ g; p; }' file
123 345
32 78

grepそして組み合わせを使用すると、最初は空sedまたは空のように見えるすべての行をフィルタリングしてから、最初の行と最後の行のみを出力できます。

$ grep '[[:graph:]]' file | sed -n -e 1p -e '$p'
123 345
32 78

元のデータの最初の行でなくても空でない最初の行も出力されます。

おすすめ記事