Intereting Posts
Perl для сравнения двух последовательных строк для первого символа и игнорирования второй строки, если оба первых символа одинаковы Ошибка rsync: необъяснимая ошибка (код 255) в io.c (226) Как я могу узнать, почему у меня есть разрешения на чтение файла? ftrace не работает? Вероятно, простая ошибка Как окрасить некоторые строки в файл Отправка команд для отображения на экране Могу ли я сделать низкоуровневые изменения на корневом fs, установленном RO? Как отключить цифровую клавиатуру клавиатуры? Есть ли общий инструмент помимо gpg для шифрования файлов в AES? btrfs на openSUSE не освобождает дисковое пространство Как сортировать слова по количеству слогов? Остановить fglrx от загрузки при загрузке / выгрузке модуля fglrx без его удаления Как выполнить chown и chgrp в одной команде прозрачный "символический + бинарный патч" Нет руководства для git

AWK в одну строку для обработки файла с разным количеством полей

То, что я пытаюсь сделать, это создать небольшой сценарий, на самом деле я знаю, что можно сделать его однострочным. У меня есть большой файл, содержащий различное количество полей. И что я хочу сделать, это суммировать последнее поле в каждой записи, если это число с десятичной точкой … И распечатать результат с помощью printf с заполнителем “% f \ n” …

Чтобы суммировать последние поля, в которых есть десятичная запятая (точка):

 awk '$NF ~ /\./ { sum += $NF } END { printf("%f\n", sum ) }' file.in 

То есть, если данные в последнем поле ( $NF ) содержат точку, предположим, что это число, и добавьте его к sum . В конце выведите сумму в формате, указанном в вопросе.

Обратите внимание, что это пропустит любые целые числа в последнем поле.

Следующее позволит awk попытаться использовать последнее поле в качестве числа независимо от того, что это на самом деле. Это означает, что 1 будет интерпретироваться как 1, а 1.2 – как 1.2. Строки hello и boo будут равны нулю, а 123abc будет приниматься за 123.

 awk '{ sum += $NF } END { printf("%f\n", sum) }' 

Следующее не будет суммировать поля, которые содержат что-либо кроме цифр, точек, плюсов и минусов:

 awk '$NF ~ /^[-+0-9.]*$/ { sum += $NF } END { printf("%f\n", sum) }' 

Он по-прежнему будет принимать 09+99... (как 9), но сопоставление чисел с плавающей запятой нетривиально и зависит от формата, который вам необходим. Посмотрите, например, эти примеры на сайте RegExLib для более полезных шаблонов.