Самый быстрый способ суммировать N-ю колонку в текстовом файле

Сначала перечислите все установленные пакеты и их версии на компьютере, где вы пытаетесь создать «клон» из: 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 , существует очень много возможных ответов.

Глупые файлы

  1. printf «7 .0\n8.5\n»
  2. printf «7 .0/StartInstaller/java/jre/bin/java\n8.5/AppServer/java _ 1,7 _ 64/jre/bin/java\n»

Они имеют то преимущество, что даже не нужно читать входные данные.

Мое лучшее предположение о том, что вы действительно хотите

  1. Это становится немного хитрым, так как

     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
    
  2.  grep -o «[0-9]\. [0-9] [^] *»  ввод 

    получает каждую последовательность непустых символов начиная с цифры . цифра . 1,7 не получает строку к себе потому что он включен в строку 8 .5/... .

____________
1 Пожалуйста, всегда включайте пример ввода и вывода в ваших вопросах. Но также описывают, как вы хотите получить от входа к выходу, или вы получите глупые ответы.

7
02.07.2018, 16:25
3 ответа

Массив данных GNU

$ 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кажутся лучшими.

17
27.01.2020, 20:14

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), и все эти преимущества в скорости исчезнут (, не говоря уже о том, что некоторые из них не смогут выполнить необходимую обработку ).

6
27.01.2020, 20:14

Вы можете использовать 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.

1
27.01.2020, 20:14

Теги

Похожие вопросы