Разделение в awk, не не печатающем значения массива

Пределом размера управляет способная опция APT::Periodic::MaxSize. Можно отобразить текущее значение с помощью следующей команды:

apt-config dump | grep Periodic

Для установки размера отредактируйте или создайте файл /etc/apt/apt.conf.d/99local-archive и любая из следующих строк:

APT::Periodic::MaxSize "<size_in_MiB>";
APT::Periodic::MaxAge "<days>";
APT::Periodic::MinAge "<days>";

Посмотрите /etc/cron.daily/apt для комментариев к доступным вариантам и переходу от APT::Archives::*. (Поставки Ubuntu 14.04 /etc/apt/apt.conf.d/20archive который устанавливает APT::Archives::MaxSize. Когда они переходят к APT::Periodic в том файле будет иметь значение, что Вы помещаете свои локальные изменения в файл с более высоким количеством.)

Это устанавливает максимальный размер кэша в мебибайт. Если кэш больше, кэшируемые файлы пакета удалены, пока требованию размера не отвечают (самые большие пакеты будут удалены сначала).

Удостоверьтесь, что сделали это на всех машинах, которые монтируют каталог.

3
20.11.2014, 09:27
3 ответа

POSIX определенная длина в awk является строковой функцией, аргумент принимается за строку. Использование длины с массивом в качестве аргумента является неуточненным поведением.

В некоторых реализациях awk, таких как gawk (version >= 3.1.6), OS X версии AWK, в качестве аргумента можно использовать длину awk с массивом, который вернет количество элементов в массиве.

Массив в awk является ассоциативным массивом, петля через ассоциативный массив ничего не гарантирует о порядке. В этом случае можно воспользоваться функцией split, которая возвращает количество полей, чтобы получить количество элементов в массиве.

POSIXly можно попробовать:

$ awk -vA="$tstArr2" '
  BEGIN{n = split(A,B," ");}
  {
    if(NR > 1) {
      for(i = 1;i <= n;i++) {
        printf "%s ",$B[i];
      }
    }
    print " ";
  }
' file

SA AUS BRA  
INDIA NZ WI
5
27.01.2020, 21:11

(Для не-GNU awk, см. ответ @cuonglm.)

С этим как тестовый файл:

$ cat testUnix3.txt 
test my array which array is better array

INDIA USA SA NZ AUS ARG GER BRA
US AUS INDIA ENG NZ SRI PAK WI BAN NED IRE

Этот код выбирает столбцы 3, 5, и 8:

$ tstArr2='3 5 8'
$ awk  -vA="$tstArr2" 'BEGIN{split(A,B," ");} NR>1{for(i=1; i<= length(B); i++) printf "%s ",$B[i]; print "";}' testUnix3.txt

SA AUS BRA 
INDIA NZ WI 

Вышеупомянутое было протестировано с GNU awk.

awk циклы и порядок

awk имеет ассоциативные массивы. Как учебное руководство Grymoire awk объясняет:

существует одна незначительная проблема с ассоциативными массивами, особенно если вы использовать , чтобы команда произвела каждый элемент: вы не имеете никакого контроля порядок вывода.

, Который является причиной, почему другой код, который вы процитировали, который использует для (я в B) цикл, может, время от времени, печатать столбцы не в порядке.

GNU awk имеет расширение для преодоления этой проблемы:

$ gawk -vA="$tstArr2" 'BEGIN{split(A,B," "); PROCINFO["sorted_in"]="@ind_num_asc"} {if(NR>1){for(i in B){printf "%s ",$B[i]}print " "}}' testUnix3.txt

SA AUS BRA  
INDIA NZ WI  

Путем настройки PROCINFO ["sorted_in"] = "@ind_num_asc", индексы будут циклично выполнены в числовом порядке по возрастанию. Это расширение GNU документируется здесь .

2
27.01.2020, 21:11

Есть много накладных расходов, чтобы использовать такой мощный инструмент, как awk для такой простой задачи:

tstArr2='3,5,8'
tail -n+2 testUnix3.txt | cut -d' ' -f"$tstArr2"
1
27.01.2020, 21:11

Теги

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