最初の行と最後の行をスキップしてファイルをエコーする簡単な方法はありますか?head
でパイピングを見ていますがtail
、そのような場合には最初から全体の行数を知る必要があるようです。私もその方法を見ましたが、それをsplit
行う方法を見つけることができませんでした。
答え1
sed
パイプなしで次の操作を行います。
sed '1d;$d' file.txt
ノート
1
意味は最初の行d
意味は削除;
2 つのコマンド間の区切り記号です。$
意味は最後の行
より読みやすい:
sed -e '1d' -e '$d' file.txt
答え2
行数を事前に知る必要はありません。tail
そして、head
ファイルの始まりまたは終わりからそれぞれオフセットを得ることができます。
パイプラインはファイルの2行目から始まり(最初の行をスキップ)、最後の行で停止します(最後の行をスキップ)。開始または終了で複数行をスキップするには、それに応じて数字を調整します。
tail -n +2 file.txt | head -n -1
もちろん、逆にしても効果は同じです。
head -n -1 file.txt | tail -n +2
答え3
実行方法は次のとおりですawk
。
awk 'NR>2 {print t} {t=$0}'
別の方法がありますsed
:
sed '1d;x' file.txt
x
現在の行を前の行に切り替える高度なsed
コマンドです。現在の行はバッファに入り、前の行は画面に入るようにsed
ストリームを1行ずつ処理しています(最初の行は空白です)。
awk
各ステップ(ライン)に対する解決策は、現在の行を変数に入れて、2番目の行が通過した後にのみ印刷を開始することです。だから私たちは2番目の行から最後の行まで画面に汚れた行の順序を見ます。最後の行は変数にあり、次のステップでのみ印刷する必要があるため省略されました。ただし、すべての手順が使用され、画面にその行は表示されません。
同じ考えperl
:
perl -ne 'print $t if $.>2 ; $t=$_' file.txt
$.
行番号と$_
現在の行を示します。
perl -n
はwhile(<..>) {..}
構造のショートカット、-e
インラインスクリプトのショートカットです。
答え4
Pythonではこれを行います。
#!/usr/bin/python3
import re
import sys
file = sys.argv[1]
with open(file, 'r') as f:
L = []
for line in f:
line = re.sub(r'\n', r'', line)
L.append(line)
print('\n'.join(L[1:-1]))
上記のコードをファイルに貼り付け、名前を解決したいscript.py
ファイルに対してスクリプトを実行します。
python3 script.py /path/to/the/file
例:
$ cat file
foo
apple
banana
bar
$ python3 script.py file
apple
banana