Kafa / kuyruğa yönelik olumsuz argümanlar


14

Bu sorunun varyantları kesinlikle farklı yerlerde birkaç kez sorulmuştur, ancak son Msatırları şanssız bir dosyadan kaldırmaya çalışıyorum .

İkinci en olarak cevap içinde bu soruya bir dosyada son satırın kurtulmak için aşağıdakileri yaparak önerir:

head -n -1 foo.txt > temp.txt

Ancak, OSX ve Zsh'de denediğimde, şunu elde ederim:

head: illegal line count -- -1

Neden? Nasıl kaldırabilir M son satırları ve ilk N verilen bir dosyanın satırları?



1
Çıktısı nedir head --version? Hangi sistemi kullanıyorsunuz?
Mayıs

@jofel head --versionaslında bir hata döndürür.
Amelio Vazquez-Reina

Yanıtlar:


20

İlk 12 satırı şununla kaldırabilirsiniz:

tail -n +13

(Bu 13. satırdan baskı anlamına gelir.)

headGibi GNU headdesteği bazı uygulamalar :

head -n -12

ama bu standart değil.

tail -r file | tail -n +12 | tail -r

sahip sistemler üzerinde çalışacak tail -r(GNU ayrıca bkz tac) ancak alt uygunudur.

n1 nerede :

sed '$d' file

Ayrıca şunları da yapabilirsiniz:

sed '$d' file | sed '$d'

2 satır kaldırmak için, ama bu optimal değil.

Yapabilirsin:

sed -ne :1  -e 'N;1,12b1' -e 'P;D'

Ancak bazı uygulamalarda büyük n değerleri ile çalışmaz sed.

İle awk:

awk -v n=12 'NR>n{print line[NR%n]};{line[NR%n]=$0}'

mSatırları baştan ve sondan kaldırmak niçin:

awk -v m=6 -v n=12 'NR<=m{next};NR>n+m{print line[NR%n]};{line[NR%n]=$0}'

sed 'x;1d;$d'son iki satırı almak için de kullanılabilir. Ve w / birkaç N's bundan sonra 1dbiraz daha fazlasını elde etmek için kullanılabilir, ancak bu noktada N;P;Dzaten tavsiye ettiğiniz döngü üzerinde hiçbir avantajı sunuyor .
mikeserv

Teşekkür ederim - Son komut son derece yardımcıdır. Yaz küçük bir uyarı: Ne zaman mya nda ne zaman işe yaramaz 0. Aksi takdirde mükemmel olurdu.
Amelio Vazquez-Reina

2

İlk N çizgilerini ve son M çizgilerini kaldırmak için aşağıdaki yolu kullanabilirsiniz.

İle N=5, M=7ve dosya test.txt:

sed -n -e "6,$(($(wc -l < test.txt) - 7))p" test.txt

Komut, N + 1'den LastLine-M'ye kadar tüm satırları yazdırır.

Başka bir seçenek python kullanmaktır:

python -c 'import sys;print "".join(sys.stdin.readlines()[5:-7]),' < test.txt

1

Aşağıdaki dosyalardan son M(burada M = 100) satırları kaldırabilirsiniz :

head -$(($(wc -l < foo.txt) - 100)) foo.txt > temp.txt
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.