Unix - голова и хвост файла - PullRequest
       17

Unix - голова и хвост файла

116 голосов
/ 24 декабря 2011

Скажем, у вас есть текстовый файл, какая команда для одновременного просмотра первых 10 строк и 10 нижних строк файла?190-200 за один раз.

Ответы [ 19 ]

1 голос
/ 24 декабря 2011

Первые 10 строк файла.ext, затем его последние 10 строк:

cat file.ext | head -10 && cat file.ext | tail -10

Последние 10 строк файла, затем первые 10:

cat file.ext | tail -10 && cat file.ext | head -10

Затем вы можете передать вывод в другом месте:

(cat file.ext | head -10 && cat file.ext | tail -10 ) | your_program

0 голосов
/ 24 октября 2018

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

Вот как я недавно обработал это для ряда очень больших CSV-файлов, которые я анализировал:

$ for file in *.csv; do echo "### ${file}" && head ${file} && echo ... && tail ${file} && echo; done

Это печатает первые 10 строк и последние 10 строк каждого файла, а также распечатывает имя файла и некоторые многоточия до и после.

Для одного большого файла вы можете просто запустить следующее для того же эффекта:

$ head somefile.csv && echo ... && tail somefile.csv
0 голосов
/ 23 июля 2018

Чтобы напечатать первые 10 и последние 10 строк файла, вы можете попробовать это:

cat <(head -n10 file.txt) <(tail -n10 file.txt) | less

0 голосов
/ 14 октября 2018
sed -n "1,10p; $(( $(wc -l ${aFile} | grep -oE "^[[:digit:]]+")-9 )),\$p" "${aFile}"

ПРИМЕЧАНИЕ : переменная aFile содержит полный путь файла .

0 голосов
/ 23 апреля 2018

Основываясь на том, что @Samus_ объяснил здесь о том, как работает команда @Aleksandra Zalcman, этот вариант удобен, когда вы не можете быстро определить, где начинается хвост, не считая строк.

{ head; echo "####################\n...\n####################"; tail; } < file.txt

Или, если вы начинаете работать с чем-то, кроме 20 строк, подсчет строк может даже помочь.

{ head -n 18; tail -n 14; } < file.txt | cat -n
0 голосов
/ 18 октября 2017

Я давно искал это решение. Пробовал сам с помощью sed, но проблема с незнанием длины файла / потока была непреодолимой. Из всех опций, доступных выше, мне нравится решение awk Камиля Гудесена. Он отметил, что его решение оставило лишние пустые строки в выводе с достаточно маленьким набором данных. Здесь я приведу модификацию его решения, которая удаляет лишние строки.

headtail() { awk -v offset="$1" '{ if (NR <= offset) print; else { a[NR] = $0; delete a[NR-offset] } } END { a_count=0; for (i in a) {a_count++}; for (i=NR-a_count+1; i<=NR; i++) print a[i] }' ; }
0 голосов
/ 30 марта 2012

Почему бы не использовать sed для этой задачи?

sed -n -e 1,+9p -e 190,+9p textfile.txt

0 голосов
/ 23 апреля 2013

Для обработки каналов (потоков), а также файлов, добавьте это в ваш файл .bashrc или .profile:

headtail() { awk -v offset="$1" '{ if (NR <= offset) print; else { a[NR] = $0; delete a[NR-offset] } } END { for (i=NR-offset+1; i<=NR; i++) print a[i] }' ; }

Тогда можно не только

headtail 10 < file.txt

но также

a.out | headtail 10

(Это все еще добавляет ложные пустые строки, когда 10 превышает длину ввода, в отличие от простого старого a.out | (head; tail). Спасибо, предыдущие ответчики.)

Примечание: headtail 10, а не headtail -10.

0 голосов
/ 20 октября 2014

опираясь на идеи выше (проверено bash & zsh)

, но с использованием псевдонима 'hat' Head and Tails

alias hat='(head -5 && echo "^^^------vvv" && tail -5) < '


hat large.sql
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...