Fájltartalom nyomtatása az első és az utolsó sor nélkül

Van-e egyszerű módja annak, hogy visszhangozhassak egy fájlt, kihagyva az első és az utolsó sort? Néztem a head csövezést a tail ba, de azok számára úgy tűnik, hogy kezdettől fogva tudnom kellene a teljes vonalakat. Néztem a split -et is, de ezzel sem látom a módját.

Válasz

Csak sed vel, csövek nélkül:

sed "1d;$d" file.txt 

MEGJEGYZÉS

  • 1 jelentése első sor
  • d jelentése törlés
  • ; 2 parancs elválasztója
  • $ jelentése utolsó sor

Válasz

Nem kell előre tudni a sorok számát. A tail és a head eltolást vehet fel a fájl elejétől vagy végétől.

Ez a cső a fájl második sora (az első sor kihagyása) és az utolsó előtt áll meg (az utolsó sor kihagyása). Ha az elején vagy a végén egynél több sort szeretne kihagyni, állítsa be ennek megfelelően a számokat.

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

fordítva, természetesen ugyanúgy működik:

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

Megjegyzések

  • Nem ' nem tudja, miért, de a head -n -1 eltávolítja az .txt fájlom első ÉS utolsó sorát az Ubuntu 14.04.2LTS-en.
  • MacOS rendszeren head -n -1 azt mondja, hogy head: illegal line count -- -1
  • head -n -1 működik GNU coreutils, lehet, hogy a MacOS-nak van valami BSD-változata?

Válasz

A awk:

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

A sed másik módja is:

sed "1d;x" file.txt 

x haladó sed parancs, az aktuális sort átkapcsolja a előző: az áram megy a pufferbe és az előzőbe s a képernyőre megy, és így tovább, miközben sed soronként feldolgozza a folyamot (ezért az első sor üres lesz).

awk megoldás minden lépésnél (sornál) az aktuális sort beteszi a változóba, és csak a második sor áthaladása után kezdi el kinyomtatni. Így a képernyőn a másodperctől az utolsóig egy sima sorozatot kaptunk. Az utolsó sort kihagyjuk, mivel a sor a változóban van, és csak a következő lépésre kell kinyomtatni, de az összes lépés már elfogyott, és soha nem látjuk a sort a képernyőn.

Ugyanez az ötlet a perl:

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

$. a sorszámot, az $_ az aktuális sort jelenti.
perl -n a while(<..>) {..} struktúra és a -e az inline parancsfájloké.

Válasz

Mac felhasználók számára:

Mac rendszeren head -n -1 nem működik. Ehelyett fordítsa meg a fájlt, vágja le az első sort, majd fordítsa vissza:

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

Magyarázat:

  1. tail -r: megfordítja a beviteli sorok sorrendjét

  2. tail -n +2: kinyomtatja az összes l-t ines a bevitel második sorától kezdődően

Megjegyzések

  • Meghiúsulna a head: illegal line count -- -1 hogy pontos legyek.

Válasz

A pythonban ezt szeretném csinálni.

#!/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])) 

Illessze be a fenti kódot egy fájlba, és nevezze el script.py néven. Futtassa a szkriptet az ellenőrizni kívánt fájlhoz.

python3 script.py /path/to/the/file 

Példa:

$ cat file foo apple banana bar $ python3 script.py file apple banana 

Megjegyzések

  • ''.join(list(open("/path/to/file"))[1:-1]): Úgy tűnik, hogy ez egyszerűbb megoldás 🙂 És ha közvetlenül a parancssorban kell végrehajtani, akkor megpróbálhatja: python -c 'print("".join(list(open("/path/to/file"))[1:-1]))'

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük