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

最初と最後の行をスキップしてファイルをエコーする簡単な方法はありますか? headからtailへの配管を検討していましたが、最初から合計行数を知る必要があるようです。 splitも調べていましたが、それを使用する方法もわかりません。

回答

sedのみ、パイプなし:

sed "1d;$d" file.txt 

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

<を意味しますh2>回答

事前に行数を知る必要はありません。 tailheadは、それぞれファイルの最初または最後からオフセットを取ることができます。

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

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

逆の場合も、もちろん同じように機能します。

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

コメント

  • 私は' t理由はわかりますが、head -n -1は、Ubuntu14.04.2LTSで.txtファイルの最初と最後の行を削除します。
  • MacOSではhead -n -1head: illegal line count -- -1
  • head -n -1はGNU coreutils、MacOSにはBSDバリアントがあるのでしょうか?

回答

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

sedの別の方法:

sed "1d;x" file.txt 

xは高度なsedコマンドで、現在の行を前のもの:電流はバッファに流れ、前にsedがストリームを1行ずつ処理している間、sは画面に移動します(これが最初の行が空白になる理由です)。

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

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

$.は行番号を表し、$_は現在の行を表します。
perl -n

構造と-eはインラインスクリプト用です。

回答

Macユーザーの場合:

Macの場合、head -n -1は機能しません。代わりに、ファイルを反転し、最初の行を切り取ってから元に戻します:

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

説明:

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

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

コメント

回答

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 

コメント

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です