最初と最後の行なしでファイルの内容を印刷する


54

最初と最後の行をスキップして、ファイルをエコーする簡単な方法はありますか?からheadにパイピングを検討していましたtailが、それらについては、最初から総ラインを知る必要があるようです。私も見ていましたがsplit、それでもそれを行う方法がわかりません。

回答:


97

だけでsed、パイプなし:

sed '1d;$d' file.txt

注意

  • 1平均の最初の行
  • d削除を意味する
  • ; 2つのコマンドの区切り文字です
  • $平均最後の行

36

事前に行数を知る必要はありません。tailそしてhead、それぞれのファイルの先頭や末尾からのオフセットを取ることができます。

このパイプは、ファイルの2行目で始まり(最初の行をスキップする)、最後の1つを除いて(最終行をスキップする)停止します。先頭または末尾で複数の行をスキップするには、それに応じて数値を調整します。

tail -n +2 file.txt | head -n -1

もちろん、逆の方法でも同じように機能します。

head -n -1 file.txt | tail -n +2

理由はわかりませんが、Ubuntu 14.04.2LTSでファイルのhead -n -1最初と最後の行を削除し.txtます。
ソパラホデアリエレス

9

これを行う方法はawk次のとおりです。

awk 'NR>2 {print t} {t=$0}'

また別の方法sed

sed '1d;x' file.txt

x高度なsedコマンドであり、現在の行を前の行に切り替えます。現在の行はバッファーに入り、前の行は画面に移動しますsed

awk各ステップ(行)のソリューションは、現在の行を変数に入れ、2行目が通過した後にのみ出力を開始します。したがって、画面上の2行目から最後の1行目までの一連の行が乱雑になりました。行は変数内にあり、次のステップでのみ印刷される必要があるため、最後の行は省略されますが、すべてのステップがすでに実行されており、画面に行が表示されることはありません。

で同じアイデアperl

perl -ne 'print $t if $.>2 ; $t=$_' file.txt

$.行番号と$_ 現在の行を表します。構造の
perl -nショートカットであり、インラインスクリプト用です。while(<..>) {..}-e


2

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

2

Macユーザーの場合:

Macではhead -n -1動作しません。代わりに、ファイルを反転し、最初の行を切り取り、次に元に戻します。

tail -r file.txt | tail -n +2 | tail -r

説明:

  1. tail -r :入力の行の順序を逆にします

  2. tail -n +2 :入力の2行目から始まるすべての行を出力します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.