Хобрук: Ваш путь к мастерству в программировании

Доступ к массиву bash в цикле awk

У меня есть массив bash, например

myarray = (1 2 3 4 5 ... n)

Также я читаю файл с вводом только одной строки, например:

1 2 3 4 5 ... n

Я читаю его построчно в массив и печатаю его с помощью:

awk 'BEGIN{FS=OFS="\t"}
     NR>=1{for (i=1;i<=NF;i++) a[i]+=$i}
     END{for (i=1;i<NF;i++) print OFS a[i]}' myfile.txt

myarray имеет тот же размер, что и a. Теперь myarray начинается с индекса 0, а a с индексом 1. Однако моя главная проблема заключается в том, как я могу передать массив bash своему выражению awk, чтобы я мог использовать его внутри цикла печати с соответствующими элементами. Итак, что я пробовал, было это:

awk -v array="${myarray[*]}"
    'BEGIN{FS=OFS="\t"}
     NR>=1{for (i=1;i<=NF;i++) a[i]+=$i}
     END{for (i=1;i<NF;i++) print OFS a[i] OFS array[i-1]}' myfile.txt

Однако это не работает. Я не получаю никакого вывода для myarray. Мой желаемый результат в этом примере:

1   1
2   2
3   3
4   4
5   5
...
n   n
16.06.2015

Ответы:


1

Насколько я понимаю, вам просто нужно правильно передать awk массив bash. То есть с помощью split():

awk -v bash_array="${myarray[*]}" 
     'BEGIN{split(bash_array,array); FS=OFS="\t"}
      NR>=1{for (i=1;i<=NF;i++) a[i]+=$i} 
      END{for (i=1;i<NF;i++) print a[i], array[i]}' file

Поскольку массив array[] теперь находится в awk, вам не нужно заботиться об индексах, так что вы можете вызывать их как обычно, не беспокоясь об индексах в bash, начиная с 0.

Также обратите внимание, что print a,b такой же (и чище), что и print a OFS b, поскольку вы уже определили OFS в блоке BEGIN.

16.06.2015
  • Спасибо. Вот в чем проблема! Просто на стороне: можно ли сделать что-то вроде OFS="\t\t". Потому что иногда мне нужно два из них, чтобы правильно выровнять числа. 16.06.2015
  • @ uitty400, конечно, вы можете проверить это с помощью echo "1 2 3" | awk 'BEGIN {OFS="\t\t"} {print $1, $2}'. 16.06.2015
  • @ uitty400 вам, вероятно, нужно сказать BEGIN{FS="\t"; OFS="\t\t"}. Или даже FS="\t"; OFS=FS FS!! (это меня удивило) 16.06.2015
  • Вот и все. Спасибо за помощь! 16.06.2015
  • Новые материалы

    Декларативное и функциональное программирование в стиле LINQ с использованием JavaScript с использованием каррирования и генератора ...
    LINQ - одна из лучших функций C #, которая обеспечивает элегантный способ написания кода декларативного и функционального стиля, который легко читать и понимать. Благодаря таким функциям ES6,..

    Структуры данных в C ++ - Часть 1
    Реализация общих структур данных в C ++ C ++ - это расширение языка программирования C, которое поддерживает создание классов, поэтому оно известно как C с классами . Он используется для..

    Как я опубликовал свое первое приложение в App Store в 13 лет
    Как все началось Все началось три года назад летом после моего четвертого класса в начальной школе. Для меня, четвертого класса, лето кажется бесконечным, пока оно не закончится, и мой отец..

    Что в лицо
    Очерк о возвращении физиогномики и о том, почему мы должны это приветствовать. История начинается со странной науки. Р. Тора Бьорнсдоттир, Николас О. Рул. Видимость социального класса по..

    Почему шаблоны проектирования и почему нет?
    Сложность — мать всех проблем в программировании. Программное обеспечение должно быть разработано с точки зрения того, кто его поддерживает, а не того, кто его пишет, потому что программное..

    Создание дизайна обуви с помощью машинного обучения
    Обувь. Что подождать? Я думал, что речь пойдет о машинном обучении! Ну это так. Если бы вы пошли на Amazon, сколько обуви вы бы нашли? Наверное, много, не так ли? Но много ли в них..

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