Как удалить первые n строк файла ascii с помощью команд оболочки?

93

У меня есть несколько файлов, которые содержат текстовую информацию ascii в первых 5-10 строках, за которыми следуют хорошо табличные данные матрицы В сценарии оболочки я хочу удалить эти первые несколько строк текста, чтобы я мог использовать информацию чистой матрицы в другой программе. Как я могу использовать команды оболочки bash для этого?

Если это поможет, я использую RedHat и Linux-системы Ubuntu.

Павел
источник

Ответы:

144

Пока файл не является символической или жесткой ссылкой, вы можете использовать sed, tail или awk. Пример ниже.

$ cat t.txt
12
34
56
78
90

СЕПГ

$ sed -e '1,3d' < t.txt
78
90

Вы можете также использовать СЭД на месте без временного файла: sed -i -e 1,3d yourfile. Это ничего не отразит, это просто изменит файл на месте. Если вам не нужно передавать результат в другую команду, это проще.

хвост

$ tail -n +4 t.txt
78
90

AWK

$ awk 'NR > 3 { print }' < t.txt
78
90
Игнасио Васкес-Абрамс
источник
8
Вы можете также использовать СЭД на месте без временного файла: sed -i -e 1,3d yourfile. Это ничего не отразит, это просто изменит файл на месте. Если вам не нужно передавать результат в другую команду, это проще.
Яник Жируард
1
Спасибо @YanickGirouard, @IgnacioVazquezAbrams! Вы двое только что сэкономили мне кучу ручного труда на моих исследованиях! :)
Пол
2
@ Светлана sed -iспециально. Большинство реализаций просто удаляют файл и заменяют его новым, который не работает для ссылок, поскольку в итоге вы оставляете оригинал в другом месте.
jw013
6
как насчет объяснения того, что «1,3d», +4, и т.д. означает? Вопрос был для n строк, но вы не сказали, что такое n (как видно, n равно 2 в ваших примерах, хотя для новичка не очевидно, что нужно изменить, чтобы изменить n)
Робин Маноли
3
При этом используется временный файл, поэтому он не очень полезен для использования 100% дискового пространства. Было бы интересно иметь решение, которое делает это буквально «на месте».
Шай
11

sed -i '1,3d' file.txt

Это удаляет первые 3 строки из file.txt.

alhelal
источник
Мне нужно удалить 50 первых строк из текстового файла 10 ГБ +. Даже если она должна работать «на месте», эта команда все равно занимает несколько минут. Есть ли действительно быстрая альтернатива?
Себастьян
6

Если в табличных строках есть символы табуляции:

grep '␉' <input_file >output_file

( будучи буквальным символом табуляции) или эквивалентно

sed -n '/␉/p' <input_file >output_file

В сценарии bash / ksh / zsh вы можете написать $'\t'для вкладки, например, grep $'\t'или sed -n $'/\t/p'.

Если вы хотите удалить 10 строк в начале файла:

tail -n +11 <input_file >output_file

(обратите внимание, что это +11исключить 10 строк, потому что +11означает «начать со строки 11» и строки с номерами хвостов от 1) или

sed '1,10d' <input_file >output_file

В Linux вы можете воспользоваться -iопцией GNU sed для изменения файлов на месте:

sed -i -n '/\t/p' *.txt

Или вы можете использовать цикл оболочки и временные файлы:

for x in *.txt; do
  tail -n +11 <"$x" >"$x.tmp"
  mv "$x.tmp" "$x"
done

Или, если вы не хотите изменять файлы на месте, а вместо этого дать им другое имя:

for x in *.txt; do
  tail -n +11 <"$x" >"${x%.txt}.data"
done
жилль
источник
3
«табулированный» обычно означает «красиво напечатанный в таблице», а не «с отступом от символов табуляции».
Игнасио Васкес-Абрамс
@ IgnacioVazquez-Абрамс, я знаю. В красивой печатной таблице иногда используются символы табуляции, которые легче обнаружить, чем выровненные столбцы. Конечно, если бы Пол дал образец ввода, я мог бы дать лучшее сопоставление.
Жиль
2

Вы можете использовать Vim в режиме Ex:

ex -sc '1d5|x' file
  1. 1 перейти к первой строке

  2. 5 выберите 5 строк

  3. d удалять

  4. x сохранить и закрыть

Стивен Пенни
источник
0

эхо "a \ nb" | sed '1d' # удаляет первую строку

кот list.txt | sed '1d'> list.csv # читать list.txt и писать list.csv без первой строки

Другие полезные команды:

grep '^ |' # находит первый символ (труба |)

sed 's / | // g' # удаляет канал

sed 's / // g' # удаляет пробел

Самран Элахи
источник
0

В процентах

Использование bash, чтобы очистить файл, используя процентное число вместо абсолютного количества строк:

sed -i -e 1,$( printf  "$((`cat php_errors.log | wc -l` * 75 /100 ))" )d php_errors.log

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

Удаляет первые 75% строк из указанного файла.

прецизионный самописец
источник