LinuxForum.Fans
Тема

Где ошибка?

Автор: valet 12 сообщений 2030 просмотров
#276206

Хочу взять с одного файла столько строк, сколько находится в другом файле.
К примеру в файле 10.txt - 10 строк, в файле 100.txt - 100 строк, хочу с файла 100.txt взять столько строк, сколько в файле 10.txt то есть 10 строк и записать в файл new.txt

Показать
cat 10.txt
10
10
10
10
10
10
10
10
10
10
Показать
cat 100.txt
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100

Делаю как-то так:

text
wc -l 100.txt; head -n `wc -l 100.txt` 1000.txt > new.txt; wc -l new.txt;
100 100.txt
203 new.txt

в результате содержимое файла new.txt получается таким:

Показать
cat new.txt
==> 10.txt <==
10
10
10
10
10
10
10
10
10
10

==> 100.txt <==
100
100
100
100
100
100
100
100
100
100

Что происходит, что я делаю не так?

#276210

Ошибка в используемых средствах.
Сделай так:

text
wc -l 100.txt; head -n `egrep -c "*" 100.txt` 1000.txt > new.txt; wc -l new.txt;

Сам же видишь, что твоя команда `wc -l 100.txt` выводит не одно число, а ещё и имя файла.

#276261

Точно :), спасибо.
Я уже думал будет взрыв мозга у меня :).

#277344
"Vascom" написал:
выводит не одно число, а ещё и имя файла.

проблема-то...
wc -l tags | sed 's/ .*//'

#277346
drBatty написал:
[quote="Vascom"]выводит не одно число, а ещё и имя файла.

проблема-то...
wc -l tags | sed 's/ .*//'[/quote]
Мой вариант проще и понятнее. Хотя конечно множество вариантов расширяет кругозор и позволяет не зацикливаться на одном средстве.

#277367
"Vascom" написал:
Мой вариант проще и понятнее.

да ладно! найти во всём файле все любые строки и вывести их число...
Кроме того:
1. egrep устарела, и её уже много лет НЕ рекомендуют использовать. Все, кроме некоторых слоупуков. ;)
2. я не смог распарсить ваш хитрый регексп "*". даже если и есть такое расширение, то в общем случае это как минимум нестандартно, а скорее всего - ошибка. Ибо звёздочка это квантификатор количества, и сама по себе смысла НЕ имеет. Это как деление на ноль.

"Vascom" написал:
Хотя конечно множество вариантов расширяет кругозор и позволяет не зацикливаться на одном средстве.

А это - пожалуйста:

text
sed '$=;d'
#277382

Ой, egrep устарело. Ну не используй, используй grep -E, делов-то.
Ну а grep -E отлично парсит "*".

#277390
"Vascom" написал:
Ой, egrep устарело. Ну не используй, используй grep -E, делов-то.

я и не использую, во избежание проблем. И другим не советую. И советовать не советую тоже.

"Vascom" написал:
Ну а grep -E отлично парсит "*".
ъ
твоя сегодня распарсила. Это не говорит о том, что не твоя и/или не сегодня распарсит. Любой быдлокод тоже прекрасно работает... На машине быдлокодера при тестовом прогоне. Часто он работает и в продакшене. Это хорошо?
#277398

Любой код должен тестироваться, будь он быдло- или небыдло. Особенно это важно для продакшена. Поэтому проблемы вызывать не должно.
А если использование одного грепа будет гораздо быстрее, чем конструкции из cat+sed, то и подавно. Bash и так очень медленный, чтобы пренебрегать такими оптимизациями.

#277405
"Vascom" написал:
Любой код должен тестироваться, будь он быдло- или небыдло.

проблема быдлокода в том, что он проходит тестирование. Если калькулятор при попытке деления на ноль выдаёт "бесконечность", то это калькулятор от микрософт. Возможно в десктопе среднестатистического МД это допустимо, но в продакшене быть такого не должно (но таки есть, спасибо советчикам).

"Vascom" написал:
А если использование одного грепа будет гораздо быстрее, чем конструкции из cat+sed, то и подавно. Bash и так очень медленный, чтобы пренебрегать такими оптимизациями.

cat + sed никто не предлагал. В данном случае вся нагрузка ложится на первую команду, которая и считает строки. Но wc -l только считает строки, а grep -E '*' ещё и ищет ошибочный регэксп в строке. Очевидно это дольше. Можешь сам проверить на большом файле (возможно получится одинаково, если бутылочное горло будет на io HDD).
sed в моём примере всего-лишь исправляет вывод одной строки, и временем её работы можно пренебречь.

ЗЫЖ и да, баш тут вообще не причём.

#277411

Ребята, не ругайтесь, все нормально [:} . Оба ваши варианты работают!

#277434

"valet" написал:
Оба ваши варианты работают!
я знаю. Работают.
Войдите или зарегистрируйтесь, чтобы ответить.