Сначала перечислите все установленные пакеты и их версии на компьютере, где вы пытаетесь создать «клон» из: rpm -qa >/tmp/rpm.list.txt
.
Затем скопируйте /tmp/rpm.list.txt
в систему, которую вы пытаетесь превратить в «клон» другой системы, и запустите zypper и передайте ему только что созданный список пакетов: zypper install $ (cat/tmp/rpm.list.txt)
(или куда бы вы ни поместили файл, содержащий список пакетов из
-121--50452-
Другой способ (аналогично моему ответу в этом вопросе ):
printf 'string' | paste -d'\0' - infile > outfile
или:
printf string | cat - infile > outfile
или:
{ printf string; cat infile; } > outfile
-121--98861-
Так как вы не описали , что вы хотите, но только показанные вход и выход 1 , существует очень много возможных ответов.
printf «7 .0\n8.5\n»
printf «7 .0/StartInstaller/java/jre/bin/java\n8.5/AppServer/java _ 1,7 _ 64/jre/bin/java\n»
Они имеют то преимущество, что даже не нужно читать входные данные.
Это становится немного хитрым, так как
grep -o «[0-9]. [0-9]» входдает выход
7.0
8.5
1.7
, поскольку он находит каждую цифру . последовательность цифр
,
и есть два из них на второй строке входа.
Но
grep -o «/[ 0-9]. [0-9 ]/» входдает выход
/7.0/
/8.5/
(каждая / цифра . цифра /
последовательность),
который может быть близок к желаемому, а затем
grep -o «/[ 0-9]\. [0-9 ]/» input | grep -o «[0-9]\. [0-9]»
дает результат
7,0
8.5
grep -o «[0-9]\. [0-9] [^] *» ввод
получает каждую последовательность непустых символов
начиная с цифры . цифра
.
1,7
не получает строку к себе
потому что он включен в строку 8 .5/...
.
____________
1 Пожалуйста, всегда включайте пример ввода и вывода
в ваших вопросах.
Но также описывают, как вы хотите получить от входа к выходу,
или вы получите глупые ответы.
$ datamash -t, count 3 sum 3 < file
3,604720
Некоторые испытания
$ time gawk -F',' '{ sum += $3 } END{ print sum, NR }' longfile
604720000000 3000000
real 0m2.851s
user 0m2.784s
sys 0m0.068s
$ time mawk -F',' '{ sum += $3 } END{ print sum, NR }' longfile
6.0472e+11 3000000
real 0m0.967s
user 0m0.920s
sys 0m0.048s
$ time perl -F, -nle '$sum += $F[2] }{ print "$.,$sum"' longfile
3000000,604720000000
real 0m3.394s
user 0m3.364s
sys 0m0.036s
$ time { cut -d, -f3 <longfile |paste -s -d+ - |bc ; }
604720000000
real 0m1.679s
user 0m1.416s
sys 0m0.248s
$ time datamash -t, count 3 sum 3 < longfile
3000000,604720000000
real 0m0.815s
user 0m0.716s
sys 0m0.036s
Таким образом, mawk
и datamash
кажутся лучшими.
Awk
— это быстрый и производительный инструмент для обработки текстовых файлов.
awk -F',' '{ sum += $3 }
END{ printf "Sum of 3rd field: %d. Total number of lines: %d\n", sum, NR }' file
Пример вывода:
Sum of 3rd field: 604720. Total number of lines: 3
Концептуальная записка:
Я должен отметить, что все эти альтернативы, отличные от -awk
, могут работать быстрее только для таких «идеальных» числовых столбцов. Вам стоит только иметь немного более сложный формат (, например. с некоторой дополнительной информацией, которая будет удалена перед вычислением <1064458324:a,<38009543:b,<201507:c,<9:d,<0:e,<1:f,<1:g,1298
), и все эти преимущества в скорости исчезнут (, не говоря уже о том, что некоторые из них не смогут выполнить необходимую обработку ).
Вы можете использовать cut
для извлечения поля, paste
для вставки +
знаков между числами и bc
для их суммирования. Вы можете использовать wc
для подсчета строк.
Однако я не уверен, какой будет производительность на миллионах строк. Но золотое правило производительности — не гадать, а измерять. Вам необходимо профилировать любое решение, чтобы увидеть, обеспечивает ли оно необходимую вам производительность, и определить, увеличивают или уменьшают ли какие-либо изменения производительность и насколько.
Вот решение, которое суммирует заданное поле и печатает количество строк:
echo -n "Sum: "
cut -d, -f3 <file |paste -s -d+ |bc
echo -n "Lines: "
wc -l <file
Выход:
Sum: 604720
Lines: 3
Поле определяется параметром -f#
для cut
, здесь cut -f3
.