ファイルから空でないか空白ではない最初と最後の行を印刷したいと思います。可能であれば、またはsed
を使用してくださいawk
。
- 入力ファイル:
その後に空白行があります123 345 456 087 er 56 32 78
32 78
。 - 希望の出力:
123 345 32 78
答え1
質問のテキストが修正されたので、ここで両方の質問に答えています。
ファイルの最初の行と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
。行が完全に空の場合、または空白のみで構成されている場合はNF
0です。- プログラムが実際に視覚的に空ではない行、つまりゼロでは
NF
ないと評価されている行を検出すると、行のtrue
内容をバッファに保存しますlast
。これが最初の行である場合(カウンタ変数はc
設定されずに計算されますfalse
)、現在の行を印刷します。とにかく増加するので、c
これは空でない最初の行に対して一度だけ発生する可能性があります。 last
最後に空でない最後の行の内容を印刷すると、提供されるc>1
、空でない行が1つしかない場合、その行は一度だけ印刷されます。すべての行が空の場合はc
0と評価され、句には何も印刷されません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