Негативні аргументи на голову / хвіст


14

Варіанти цього питання, безумовно, задавались декілька разів у різних місцях, але я намагаюся видалити останні Mфайли з файлу без удачі.

Другий найбільш проголосували відповідь на це питання рекомендує зробити наступне , щоб позбутися від останнього рядка в файлі:

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

Однак, коли я спробую це в OSX & Zsh, я отримую:

head: illegal line count -- -1

Чому так? Як я можу видалити M останні рядки і в перші N рядки цього файлу?



1
Який вихід head --version? Яку систему ви використовуєте?
jofel

@jofel head --versionфактично повертає помилку.
Амеліо Васкес-Рейна

Відповіді:


20

Перші 12 рядків можна видалити за допомогою:

tail -n +13

(Це означає друк з 13-го рядка.)

Деякі реалізації, headтакі як headпідтримка GNU :

head -n -12

але це не стандартно.

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

буде працювати в тих системах, які мають tail -r(див. також GNU tac), але є неоптимальними.

Де n1:

sed '$d' file

Ви також можете зробити:

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

видалити 2 рядки, але це не оптимально.

Ви можете зробити:

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

Але будьте обережні, що з деякими реалізаціями не працюватимуть великі значення nsed .

З awk:

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

Щоб видалити mлінії з початку та nз кінця:

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'може бути використаний і для отримання останніх двох рядків. І з / п пару Nпісля цього 1dможна використати для отримання трохи більше, хоча в цей момент він не дає переваги перед N;P;Dциклом, який ви вже рекомендуєте.
mikeserv

Дякую - Остання команда надзвичайно корисна. Влітку невеликий нюанс: це не працює , коли mабо nє 0. Інакше було б ідеально.
Амеліо Васкес-Рейна

2

Ви можете скористатися наступним способом для видалення перших N рядків і останніх M рядків.

З N=5, M=7і файл test.txt:

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

Команда друкує всі рядки від N + 1 до LastLine-M.

Іншим варіантом є використання python:

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

1

Ви можете видалити останні M(тут M = 100) рядки з файлу за допомогою:

head -$(($(wc -l < foo.txt) - 100)) foo.txt > temp.txt
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.