определение максимальной длины символов в каждом столбце с помощью цикла и awk

Многие другие люди вникают в детали более сложных make-файлов и много сложностей, которые с ними связаны. Обычно я использую make-файлы совсем по другой причине:

Я не хочу ничего вспоминать.

Даже если ваш проект действительно скучный и простой, и вы не используете make-файлы «правильно»:

all:
    gcc main.c -o project

Мне не нужно думать об этом или относиться к нему иначе, чем к более сложному проекту:

all:
    gcc libA.c libB.c main.c -o project2

Или, если я указал флаги (, например.-O2)Мне не нужно помнить, что они были.

Кроме того, если вы начинаете с простого make-файла, а позже вам нужно выполнить слияние/рефакторинг, вам не нужно помнить о том, что каждый проект нужно собирать по-разному.

0
15.07.2020, 15:50
1 ответ

Следующий код должен работать:

awk -F'|' '{for (i=1;i<=NF;i++) {len=length($i); if (len>lval[i]) {lval[i]=len; lpos[i]=FNR;}}} END{for (i in lval) printf("Longest value of column %d: %d (line %d)\n",i,lval[i],lpos[i])}' contact_d.csv

Для приведенного выше примера возвращается

Longest value of column 1: 7 (line 1)
Longest value of column 2: 9 (line 1)
Longest value of column 3: 14 (line 1)
Longest value of column 4: 26 (line 2)
  • Этот сценарий будет для каждой строки перебирать все поля (от 1 до NF, количество полей )и проверять, хранится ли длина поля (временно в переменнойl)больше самой длинной найденной длины, которая хранится в переменной массива lvalпод индексом поля (= номер столбца ).

  • В первой строке lvalеще не инициализирован, и он будет вести себя так, как если бы все lval[i]были равны 0 (на самом деле, это сложнее, чем ).

  • Если длина поля iв текущей строке больше, чем значение, сохраненное в lval[i], скрипт сохранит текущую длину поля в lval[i]и номер текущей строки (, который доступен через «автоматическую» переменнуюFNR)в переменную массива lpos.

  • В конце файла(ENDусловие )будет напечатана самая длинная длина и соответствующая позиция для всех столбцов. Я использую конструкцию for (i in lval), которая перебирает все индексы , присутствующие в массиве lval, поэтому мне не нужно сохранять количество столбцов в дополнительной переменной (, как это было бы необходимо для что-то вродеfor (i=1;i<=ncols;i++)-в блоке END, понятие «количество полей» становится несколько плохо -определенным, хотя на практике awkчасто используются соответствующие значения для последней строки файла при доступе ).

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

Что касается причины, по которой ваша первоначальная попытка не удалась, вы пытаетесь передать переменную оболочки($i)скрипту awk, код которого заключен в одинарные кавычки (, как рекомендуется ),но одинарные кавычки отключают интерпретацию переменных оболочки (и даже если бы это было не так, это бы так не работало ).

3
18.03.2021, 23:19

Теги

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