1 (24.09.2012 07:39:41 отредактировано valet)

Хочу взять с одного файла столько строк, сколько находится в другом файле.
К примеру в файле 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

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

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

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

2 (24.09.2012 09:27:15 отредактировано Vascom)

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

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

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

3

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

4

Vascom пишет:

выводит не одно число, а ещё и имя файла.

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

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

5

drBatty пишет:
Vascom пишет:

выводит не одно число, а ещё и имя файла.

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

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

6

Vascom пишет:

Мой вариант проще и понятнее.

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

Vascom пишет:

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

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

sed '$=;d'
Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

7

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

8

Vascom пишет:

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

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

Vascom пишет:

Ну а grep -E отлично парсит "*".

ъ
твоя сегодня распарсила. Это не говорит о том, что не твоя и/или не сегодня распарсит. Любой быдлокод тоже прекрасно работает... На машине быдлокодера при тестовом прогоне. Часто он работает и в продакшене. Это хорошо?

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

9

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

10

Vascom пишет:

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

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

Vascom пишет:

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

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

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

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

11

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

12

valet пишет:

Оба ваши варианты работают!

я знаю. Работают.

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)