最初と最後の行をスキップしてファイルをエコーする簡単な方法はありますか? head
からtail
への配管を検討していましたが、最初から合計行数を知る必要があるようです。 split
も調べていましたが、それを使用する方法もわかりません。
回答
sed
のみ、パイプなし:
sed "1d;$d" file.txt
注
-
1
は最初を意味します行 -
d
は削除 -
;
は2つのコマンドの区切り文字です -
$
は最後の行
<を意味しますh2>回答
事前に行数を知る必要はありません。 tail
とhead
は、それぞれファイルの最初または最後からオフセットを取ることができます。
このパイプはファイルの2行目(最初の行をスキップ)で、最後の1行を除いて停止します(最後の行をスキップします)。最初または最後に複数の行をスキップするには、それに応じて数値を調整します。
tail -n +2 file.txt | head -n -1
逆の場合も、もちろん同じように機能します。
head -n -1 file.txt | tail -n +2
コメント
回答
:
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
説明:
-
tail -r
:入力の行の順序を逆にします -
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
コメント
-
''.join(list(open("/path/to/file"))[1:-1])
:これはより簡単な解決策のようです:-)そして、コマンドプロンプトで直接実行する必要がある場合は、次のことを試してください:python -c 'print("".join(list(open("/path/to/file"))[1:-1]))'
head -n -1
は、Ubuntu14.04.2LTSで.txt
ファイルの最初と最後の行を削除します。head -n -1
はhead: illegal line count -- -1
head -n -1
はGNU coreutils、MacOSにはBSDバリアントがあるのでしょうか?