Как распечатать таблицу из файла Nawk

Сzsh:

count=0 range="<$start-$stop>"
/home/me/*/file_$~range.txt(Ne['((!++count))'])

Дает подсчет без сохранения списка файлов в памяти.

  • <1-100>- это оператор zsh glob, который соответствует десятичным числам в этом диапазоне (обратите внимание, что он соответствует 2, но также и 000002, например)
  • $~varаналогичен $var, за исключением того, что содержимое $varрассматривается как шаблон, а не буквальное значение.
  • (Ne['code'])является квалификатором глобуса
  • N:включает nullglobдля этого шаблона, чтобы он не терпел неудачу, если глобус не соответствует ни одному файлу (, что всегда имеет место здесь ).
  • e['code']выбирает файлы на основе оценки code. Здесь код(((!++count)))увеличивает $countи всегда возвращает false, поэтому файлы не выбираются (, а $countувеличиваются, и это все, что нас здесь интересует ).
0
02.12.2020, 11:55
1 ответ
$ cat tst.awk
BEGIN {
    ARGV[ARGC] = ARGV[ARGC-1]   # So we can read the input twice, first to get the max field widths.
    ARGC++

    # Not using character class [:blank:] because nawk does not support character classes
    FS = "[ \t]*:[ \t]*"

    split("TELEPHONE:SALARY:LICENSE NO.:NAME:AGE",inNr2Name)
    for (inNr in inNr2Name) {
        name = inNr2Name[inNr]
        wid  = length(name)
        name2wid[name] = wid
        f[name] = inNr                  # field name to input field number
    }

    print "\t\t----Employee Information---- "
}
NR==FNR {
    for (inNr=1; inNr<=NF; inNr++) {
        name = inNr2Name[inNr]
        val  = $inNr
        wid  = length(val)
        name2wid[name] = (name2wid[name] > wid ? name2wid[name] : wid)
    }
    next
}
FNR == 1 {
    outFmt = "%-" name2wid["NAME"]      "s "    \
             "%-" name2wid["TELEPHONE"] "s "    \
             "%-" name2wid["AGE"]       "s "    \
             "| "                               \
             "%-" name2wid["SALARY"]    "s "    \
             "| "                               \
             "%-" name2wid["LICENSE NO."] "s\n"

    printf outFmt, "NAME", "TELEPHONE", "AGE", "SALARY", "LICENSE NO."
}
{
    printf outFmt, $(f["NAME"]), $(f["TELEPHONE"]), $(f["AGE"]), $(f["SALARY"]), $(f["LICENSE NO."])
}

$ awk -f tst.awk file
                ----Employee Information----
NAME                      TELEPHONE      AGE | SALARY | LICENSE NO.
Miss Cherise Hilton-Moore {246} 548-1278 30  | 2500   | 175A106
Mr Reynold Watson         {408} 538-2358 37  | 1550   | 201B154
Miss Natalie Judy-Sealy   {210} 655-6279 32  | 2600   | 509UYT6
Mr John McCollin          {210} 548-1348 26  | 2500   | 175XCVD3
Mr Ronald Francis         {208} 548-1278 31  | 1880   | 150P9URE

Я использовал много промежуточных переменных, все с осмысленными именами, поэтому я ожидаю, что вы сможете понять, что они делают, после небольшого размышления и просмотра справочных страниц, но если нет, то не стесняйтесь задавать вопросы.

1
18.03.2021, 22:46

Теги

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