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


54

Чи є простий спосіб я відлучити файл, пропускаючи перший і останній рядки? Я дивився на трубопровід з headв tail, але і для тих , хто, здається , що я мав би знати , загальні лінії з самого початку. Я також дивився split, але я не бачу способу це зробити і з цим.

Відповіді:


97

Просто з sedбез труб:

sed '1d;$d' file.txt

ПРИМІТКА

  • 1середній перший рядок
  • dозначає видалити
  • ; є роздільником на 2 команди
  • $середній останній рядок

36

Вам не потрібно заздалегідь знати кількість рядків. tailі headможе зняти зсув з початку або кінця файлу відповідно.

Ця труба починається з другого рядка файлу (пропуск першого рядка) і зупиняється на останньому, але на одному (пропуск остаточного рядка). Щоб пропустити більше одного рядка на початку чи в кінці, відповідно відрегулюйте числа.

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

робити це навпаки, працює те саме, звичайно:

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

Я не знаю чому, але head -n -1видаляє перший І останній рядок мого .txtфайлу на Ubuntu 14.04.2LTS.
Sopalajo de Arrierez

9

Ось як це зробити з awk:

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

Також інший спосіб sed:

sed '1d;x' file.txt

x- це розширена sedкоманда, вона перемикає поточний рядок з попереднім: поточний переходить у буфер, а попередній переходить на екран і так далі, sedобробляючи потік рядок за рядком (саме тому перший рядок буде порожнім).

awkрішення на кожному кроці (рядку) вводить поточну лінію в змінну і починає друкувати її лише після проходження другого рядка. Таким чином, ми отримали shitfed послідовність рядків на екрані від другого до останнього, але одного. Останній рядок опущений, оскільки рядок знаходиться в змінній і повинен бути надрукований лише на наступному кроці, але всі кроки вже закінчені, і ми ніколи не бачимо рядка на екрані.

Ця ж ідея в perl:

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

$.означає номер рядка та $_ поточний рядок.
perl -nце ярлик для while(<..>) {..}структури та -eпризначений для вбудованого сценарію.


2

У python я би зробив це так.

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

Вставте вищезазначений код у файл і назвіть його як script.py. Запустіть скрипт у файлі, з яким потрібно перевірити.

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

Приклад:

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

2

Для користувачів Mac:

На Mac head -n -1не працює. Замість цього переверніть файл, відріжте перший рядок, а потім поверніть його назад:

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

Пояснення:

  1. tail -r : повертає порядок рядків у своєму введенні

  2. tail -n +2 : друкує всі рядки, починаючи з другого рядка на вводі

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.