Можно ли вывести итерированный диапазон аргументов через cli из csv? (см. пример)

Можно ли вывести итерированный диапазон аргументов через cli из csv? (см. пример)

У меня есть сотни журналов, разбросанных по нескольким тысячам виртуальных машин, и я пытаюсь создать несколько скриптов для быстрого сканирования журналов. Я разобрался с большей частью презентации и хотел бы узнать, есть ли простой способ использовать что-то вроде awk, printf и т. д., которые я знаю, как использовать, но конкретно для вывода итерированного диапазона значений из файлов журналов?

Пример:

awk -F, '{printf $(1..5)}' huge_log_file.csv
column1 column2 column3 column4 column5
etc.

Я знаю, как правильно использовать awk, форматировать, разделять и т. д. выводимые данные, но подумал, что было бы неплохо указать диапазон полей, которые я хотел бы вывести на печать.

Я обновлю свой вопрос, если разберусь, как это сделать с помощью предложенных похожих вопросов и/или самостоятельно.

Спасибо!

EDIT: Я знаю, как вручную напечатать $1 $2 $3, но не включил это в свой пример.

ПРАВКА 2: Я также знаю, как подсчитать количество полей с помощью awk, используя NF, чтобы впоследствии сделать диапазон динамическим, что является моей долгосрочной целью.

решение1

Диапазоны, начинающиеся с первого поля

Давайте рассмотрим этот тестовый файл:

$ cat input.csv
a,b,c,d,e,f,g,h,i,j

По крайней мере с помощью GNU awk мы можем вывести первые пять (или другое количество) полей следующим образом:

$ awk -F, '{NF=5; print}' OFS=, input.csv
a,b,c,d,e

Для тех, кто ценит краткость выше ясности, мы могли бы написать так:

$ awk -F, '{NF=5;} 1' OFS=, input.csv
a,b,c,d,e

Динамическое изменение размера

Чтобы пропустить последние два поля, независимо от того, сколько полей им предшествует:

$ awk -F, '{NF-=2; print}' OFS=, input.csv
a,b,c,d,e,f,g,h

Другие диапазоны

Для печати начала и окончания с произвольными полями необходим цикл:

$ awk -v first=3 -v last=6 -F, '{for (i=first;i<=last;i++) printf "%s%s",$i,(i==last?ORS:OFS)}' OFS=, input.csv
c,d,e,f

Для печати с третьего поля и динамического исключения последних двух полей:

$ awk -v first=3 -F, '{last=NF-2; for (i=first;i<=last;i++) printf "%s%s",$i,(i==last?ORS:OFS)}' OFS=, input.csv
c,d,e,f,g,h

решение2

Небольшое замечание: awkэто гораздо более гибко, но если вам нужен только определенный диапазон полей, используйте cut:

cut -d, -f1-5 huge_log_file.csv

Это гораздо проще, чем awkцикл, если это все, что вам нужно.

Связанный контент