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

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

ファイルから空でないか空白ではない最初と最後の行を印刷したいと思います。可能であれば、または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

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

答え2

次の awkプログラムがこれを行います。

awk 'NF{last=$0; if (!c++) print;} END {if (c>1) print last}' file.txt
  • awkデフォルトでは、入力行は連続したスペースとタブの「空」フィールドに分割されます。フィールド数はに保存されますNF。行が完全に空の場合、または空白のみで構成されている場合はNF0です。
  • プログラムが実際に視覚的に空ではない行、つまりゼロではNFないと評価されている行を検出すると、行のtrue内容をバッファに保存しますlast。これが最初の行である場合(カウンタ変数はc設定されずに計算されますfalse)、現在の行を印刷します。とにかく増加するので、cこれは空でない最初の行に対して一度だけ発生する可能性があります。
  • last最後に空でない最後の行の内容を印刷すると、提供されるc>1、空でない行が1つしかない場合、その行は一度だけ印刷されます。すべての行が空の場合はc0と評価され、句には何も印刷されませんEND

答え3

sed -n '/^$/d; p; :a; n; /^$/!h; $!ba; g; /^$/!p' file.txt

テストファイルの内容:

==> file_1.txt <==
123 345
456 087

er 56

32 78

==> file_2.txt <==    

123 345
456 087

er 56

32 78    

==> file_3.txt <==
123 345
456 087

er 56

32 78
==> file_4.txt <==


123 345
456 087

er 56

32 78  


==> file_5.txt <==
123 345

テスト

for f in file_{1..5}.txt; do
    echo "==> $f <=="
    sed -n '/^$/d; p; :a; n; /^$/!h; $!ba; g; /^$/!p' "$f"
done

出力:

==> file_1.txt <==
123 345
32 78
==> file_2.txt <==
123 345
32 78
==> file_3.txt <==
123 345
32 78
==> file_4.txt <==
123 345
32 78
==> file_5.txt <==
123 345

関連情報