Як видалити перші n рядків з файлу ascii за допомогою команд оболонки?


92

У мене є декілька файлів, які містять текстову інформацію ascii в перших 5-10 рядках, а потім чітко табличну матричну інформацію. У скрипті оболонки я хочу видалити ці перші кілька рядків тексту, щоб я міг використовувати чисту матричну інформацію в іншій програмі. Як я можу використовувати команди bash shell для цього?

Якщо це допоможе, я використовую RedHat та Ubuntu linux системи.

Відповіді:


143

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

$ cat t.txt
12
34
56
78
90

sed

$ 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
@Svetlana sed -iспеціально. Більшість реалізацій просто видаляють файл і замінюють його на новий, який не працює для посилань, оскільки ви в кінцевому підсумку залишаєте оригінал в іншому місці.
jw013

6
як щодо пояснення того, що "1,3d", +4 та ін. засоби? Питання було для n рядків, але ви не сказали, що таке n (оскільки, мабуть, n у ваших прикладах, хоча для noob очевидно, що змінити, щоб змінити n)
Робін Манолі

3
Для цього використовується тимчасовий файл, настільки не дуже корисний для стовідсоткового дискового простору. Було б цікаво мати рішення, яке робить це буквально «на місці».
Шай


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 ви можете скористатися можливістю GNU sed -iдля зміни файлів на місці:

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-Abrams Я знаю. Симпатично надрукована таблиця іноді використовує символи вкладок, що їх простіше помітити, ніж вирівняні стовпці. Звичайно, якби Пол дав зразок вступу, я міг би дати кращу відповідність.
Жиль

2

Ви можете використовувати Vim в режимі Ex:

ex -sc '1d5|x' file
  1. 1 перейти до першого рядка

  2. 5 виберіть 5 рядків

  3. d видалити

  4. x зберегти і закрити


0

відлуння "a \ nb" | sed '1d' # видаляє перший рядок

список котів.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% рядків із згаданого файлу.

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