Вызов массива внутри awk для создания таблицы со столбцами фиксированной ширины

Утилита sync представляет собой тривиальную обертку вокруг системного вызова sync .

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

sync также вызывается на этапе ожидания или перехода в спящий режим непосредственно перед выключением аппаратных средств. Здесь нет альтернативы, что-то должно сказать «записать все данные на диск сейчас».

Другое время, когда sync является полезным, прежде чем делать что-то, что может вызвать аварию, например, опробовать экспериментальный драйвер.

Вызов sync перед сбоем программы бесполезен. sync обрабатывает данные в буферах между программами и местом хранения носителями; он не делает ничего для данных, которые программа не сохранила в файле.

Вызов sync также бесполезен при проверке доступной памяти, поскольку он не влияет на доступную память. Хотя он делает свободные буферы записи для восстановления, он на самом деле не освобождает эти буферы - они будут освобождены, когда ядру нужно выделить память для чего-то другого, а пока они остаются в качестве кэша.

-121--63631-

Вариант 1) Получите кабель cheep hdmi-dvi, они электрически одинаковы (за исключением отсутствия звука на dvi).

Вариант 2) Используйте X11 для отображения окон из raspberry pi (под управлением Raspbrian или других X11 Linux). Используйте ssh -X для подключения к малиновому Pi.

Вариант 3) Используйте VNC для отображения всего экрана или виртуального экрана.

(Опции 2 и 3 требуют сетевого соединения между машинами)

2
17.09.2018, 18:28
2 ответа

Вы можете выполнить печать внутри цикла, по одному полю за раз.

awk '{for(i=1;i<=NF;i++) { printf "%-5s",$i } ; printf("\n"); }'

Обратите внимание, что печать новой строки необходима после цикла, чтобы предотвратить слияние нескольких строк в одну.

например

echo a b c 32 87 x5 | awk '{for(i=1;i<=NF;i++) { printf "%-5s",$i } ; printf("\n"); }'
a    b    c    32   87   x5  
5
27.01.2020, 21:53

Вы могли бы (но я не рекомендую это )создавать несколько переменных по шагам (пример в bash):

$ printf -v l '%s ' {1..30}           # list of numbers to use
$ printf -v a '%.0s%%-5s ' $l         # make a string of repeated "%-5s"
$ printf -v b ',$%s' $l               # make string of field numbers as "$1,$2.."
$ awk -va="$a" '{printf a "\n"'"$b"'}' infile4

Но вы также можете сделать это внутри awk:

$ awk '{split($0,a); for(i in a){printf "%-5s", $i}; print ""}' infile
  • splitв awkбудет использовать то же регулярное выражение в FS, которое использовалось для разделения строки на поля и помещения каждого значения в массив a.
  • forбудет (автоматически )перебирать все поля.
  • printfраспечатает все поля в одном формате.
  • И окончательный printпоместит новую строку в конец строки.

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

Или даже:

$ awk 'for(i=1;i<=NF;i++){ printf("%-5s",$i) }; print ""}' infile

Вы можете изменить формат на %-5.5s, чтобы обрезать поля, длина которых превышает 5 символов.

Обратите внимание, что printf awk неправильно считает разложенный символ, например , за два символа. Похоже, что кодовые точки Unicode (считаются общей проблемой )вместо кластеров Unicode.


РЕДАКТИРОВАТЬ Отвечая на этот дополнительный вопрос из комментариев:

sum the rows that define column #27 in my table

Просто добавьте нужный код:

$ awk '{split($0,a); 
        sum=sum+a[27];
        for(i in a){ printf "%-5s", $i };
        print ""
       } END {
       print "Sum of column 27 is =", sum }
      ' infile
1
27.01.2020, 21:53

Теги

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