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
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:
-
tail -r
: kääntää syötteiden rivien järjestyksen -
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]))'
head -n -1
poistaa.txt
-tiedostoni ensimmäisen JA viimeisen rivin Ubuntu 14.04.2LTS: ssä.head -n -1
sanoohead: illegal line count -- -1
head -n -1
toimii GNU coreutils, ehkä MacOS: lla on jokin BSD-muunnos?