Tulosta tiedostosisältö ilman ensimmäistä ja viimeistä riviä

Onko olemassa yksinkertaista tapaa toistaa tiedosto, ohittaen ensimmäinen ja viimeinen rivi? Tarkastelin putkistoa head -kohdasta tail, mutta niille näyttää siltä, että minun olisi tiedettävä kokonaislinjat alusta alkaen. Katsoin myös kohtaa split, mutta en myöskään näe tapaa tehdä sitä sen kanssa.

Vastaa

Vain sed, ilman putkia:

sed "1d;$d" file.txt 

HUOMAUTUS

  • 1 tarkoittaa ensin rivi
  • d tarkoita poista
  • ; on erotin kahdelle komennolle
  • $ tarkoittaa viimeinen rivi

Vastaa

Sinun ei tarvitse tietää rivien määrää etukäteen. tail ja head voivat siirtyä vastaavasti tiedoston alusta tai lopusta.

Tämä putki alkaa tiedoston toinen rivi (ohitetaan ensimmäinen rivi) ja pysähtyy viimeiseksi (ohitetaan viimeinen rivi). Jos haluat ohittaa useamman kuin yhden rivin alussa tai lopussa, säädä numeroita vastaavasti.

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

Toisinpäin päinvastoin, toimii tietysti samalla tavalla:

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

Kommentit

  • En halua ' tiedä miksi, mutta head -n -1 poistaa .txt -tiedostoni ensimmäisen JA viimeisen rivin Ubuntu 14.04.2LTS: ssä.
  • MacOS-käyttöjärjestelmässä head -n -1 sanoo head: illegal line count -- -1
  • head -n -1 toimii GNU coreutils, ehkä MacOS: lla on jokin BSD-muunnos?

Vastaa

Näin se tehdään awk:

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

Myös toinen tapa sed:

sed "1d;x" file.txt 

x on edistynyt komento sed, se vaihtaa nykyisen rivin edellinen: virta menee puskuriin ja edeltäjään s siirtyy näyttöön ja niin edelleen, kun sed käsittelee streamia rivi kerrallaan (siksi ensimmäinen rivi on tyhjä).

awk -ratkaisu kullekin vaiheelle (riville) laittaa nykyisen rivin muuttujaan ja alkaa tulostaa se vasta toisen rivin ohittamisen jälkeen. Siten saimme paskaisen rivisarjan näytöllä toisesta viimeiseen. Viimeinen rivi jätetään pois, koska rivi on muuttujassa ja se tulisi tulostaa vain seuraavaan vaiheeseen, mutta kaikki vaiheet ovat jo loppuneet, emmekä koskaan näe riviä näytöllä.

Sama idea perl:

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

$. tarkoittaa rivinumeroa ja $_ nykyistä riviä.
perl -n on pikakuvake while(<..>) {..} -rakenne ja -e on tarkoitettu sisäiselle komentosarjalle.

Vastaa

Mac-käyttäjät:

Macissa head -n -1 ei toimi. Sen sijaan käännä tiedosto päinvastaiseksi, katkaise ensimmäinen rivi ja käännä se sitten takaisin:

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

Selitys:

  1. tail -r: kääntää syötteiden rivien järjestyksen

  2. tail -n +2: tulostaa kaikki l Ines alkaen syötteen toisesta rivistä

Kommentit

  • Se epäonnistuu head: illegal line count -- -1 täsmälleen.

Vastaa

Pythonissa haluaisin tehdä tämän.

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

Liitä yllä oleva koodi tiedostoon ja nimeä se nimellä script.py. Suorita komentosarja tiedostoa vastaan, jonka haluat tarkistaa.

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

Esimerkki:

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

Kommentit

  • ''.join(list(open("/path/to/file"))[1:-1]): Tämä näyttää olevan yksinkertaisempi ratkaisu 🙂 Ja jos tarvitset sitä suoraan komentokehotteessa, voit yrittää: python -c 'print("".join(list(open("/path/to/file"))[1:-1]))'

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *