Многие другие люди вникают в детали более сложных make-файлов и много сложностей, которые с ними связаны. Обычно я использую make-файлы совсем по другой причине:
Даже если ваш проект действительно скучный и простой, и вы не используете make-файлы «правильно»:
all:
gcc main.c -o project
Мне не нужно думать об этом или относиться к нему иначе, чем к более сложному проекту:
all:
gcc libA.c libB.c main.c -o project2
Или, если я указал флаги (, например.-O2
)Мне не нужно помнить, что они были.
Кроме того, если вы начинаете с простого make-файла, а позже вам нужно выполнить слияние/рефакторинг, вам не нужно помнить о том, что каждый проект нужно собирать по-разному.
Следующий код должен работать:
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
, код которого заключен в одинарные кавычки (, как рекомендуется ),но одинарные кавычки отключают интерпретацию переменных оболочки (и даже если бы это было не так, это бы так не работало ).