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
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:
-
tail -r
: megfordítja a beviteli sorok sorrendjét -
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]))'
head -n -1
eltávolítja az.txt
fájlom első ÉS utolsó sorát az Ubuntu 14.04.2LTS-en.head -n -1
azt mondja, hogyhead: illegal line count -- -1
head -n -1
működik GNU coreutils, lehet, hogy a MacOS-nak van valami BSD-változata?