Как отобразить определенные части двух полей из другого файла в сценарии awk

ls -lдаст вам кажущийся размер файла, то есть число байтов, которое программа прочитает, если прочитает файл от начала до конца. duдаст вам размер файла «на диске».

По умолчанию duдает вам размер файла в количестве дисковых блоков, но вместо этого вы можете использовать -h, чтобы получить удобочитаемую единицу измерения. См. также руководство для duвашей системы.

Обратите внимание, что с GNU coreutil du(, который, вероятно, используется в Linux ), использование -bдля получения байтов подразумевает опцию --apparent-size. Это не то, что вы хотите использовать, чтобы получить количество байтов, фактически используемых на диске. Вместо этого используйте --block-size=1или -B 1.

В GNU lsвы также можете выполнить ls -s --block-size=1над файлом. Это даст тот же номер, что и du -B 1для файла.


Пример:

$ ls -l file
-rw-r--r--  1 myself wheel  536870912 Apr  8 11:44 file

$ ls -lh file
-rw-r--r--  1 myself wheel   512M Apr  8 11:44 file

$ du -h file
24K    file

$ du -B 1 file
24576   file

$ ls -s --block-size=1 file
24576 file

Это означает, что это файл размером 512 МБ, который занимает на диске около 24 КБ. Это разреженный файл (в основном нули, которые на самом деле не записываются на диск, а представлены как логические «дыры» в файле ). Разреженные файлы распространены при работе с предварительно -выделенными большими файлами, например. образы дисков для виртуальных машин или файлы подкачки и т. д. Создать разреженный файл можно быстро, а заполнять его нулями — медленно (и не нужно ).

См. также руководство для fallocateв вашей системе Linux.

0
04.01.2020, 13:49
3 ответа

Используя GNU awk и полагаясь на разделитель полей, установленный на шаблон сахара s:

awk -F'\\<s\\>' '
     sugar<NF{sugar=NF;pie=$1}
     END{print pie "has the largest amount of sugar with " sugar-1 " sugar"}
' file

Единственным оператором является установка переменной sugarчисла s, найденного в строке, и установка имени круговой диаграммы.

Когда файл проанализирован, оператор ENDвыполняется и печатает требуемую строку.

2
28.01.2020, 02:21

Вам не нужно хранить счетчики в массиве и перебирать его для каждого нового значения -просто сохраните текущий максимум и соответствующий ему круг:

#!/bin/awk -f

BEGIN {
  sugar_max = 0;
  pie_max = "";
}
{
  pie = $1; 
  $1 = ""; sugar = gsub("s","");
  if (sugar > sugar_max) {
    sugar_max = sugar;
    pie_max = pie;
  }
}

END {
  printf "%s pie has the largest amount of sugar with %d sugars\n", pie_max, sugar_max;
}

В этом случае блок BEGINне является строго обязательным, поскольку переменные awk неявно инициализируются.

1
28.01.2020, 02:21

Как насчет

awk '
function SCNT(FLD) { x = $FLD; return gsub (/s/, "&", $FLD)}
SMX < SC = SCNT(0) - SCNT(1) - SCNT(2)  {SMX = SC
                     LN = $0
                    }
END {print "Largest sugar count of", SMX, "in", LN
    }
' file
Largest sugar count of 3 in Orange pie s s s
0
28.01.2020, 02:21

Теги

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