LINUX.ORG.RU

[awk][глупый вопрос] Захватить столбцы «от N и до конца строки»

 ,


0

1

Имеются данные в виде таблицы из N столбцов. При этом N-1 столбцов не могут содержать пробел и, следовательно, нормально парсятся awk. N-й же столбец может содержать пробелы (и вообще что угодно, кроме перевода строки). Таким образом, надо сказать awk «считай, что во входном потоке может быть не больше N столбцов и всё, что после N-1-го разделителя, помещай в один столбец».

Это возможно? Погрепал ман и помучил гугл, но нужную инфу найти не осилил.

о, я, помнится, со схожей проблемой делал костыль с циклом по полям и изменением разделителя полей когда нужно

lazyklimm ★★★★★
()
Ответ на: комментарий от lazyklimm

Значит нормального способа нет? Даже в виде gawk-специфичного расширения?

geekless ★★
() автор топика
Ответ на: комментарий от mydoom

> а если cut-ом?

Проблема в том, что мне надо проверять, является ли значение i-го столбца подстрокой значения N-го столбца и разные данные выводить для этих случаев.

Сделал для этого фильтра четырёхстрочник на Руби, но честно не хотел тащить в простой скрипт зависимость от такого жирного интерпретатора, поэтому рассчитывал переделать на awk.

geekless ★★
() автор топика
Ответ на: комментарий от geekless

Это какой то нестанадртный синтаксис, в мане его я тоже не видел, нашёл в интернетах.
Но у меня работал, версию awk сейчас к сожалению не подскажу, давно это было

zolden ★★★★★
()

В общем, пока сделал так:

v = $5" "$6" "$7" "$8" "$9" "$10" "$11" "$12" "$13" "$14" "$15" "$16" "$17" "$18" "$19" "$20" "$21" "$22" "$23" "$24" "$25
А кто не спрятался^[3^Wесли больше 10-ти слов в тексте столбца, я не виноват. :)

geekless ★★
() автор топика
Ответ на: комментарий от geekless

Ну а если в последнем «столбце» окажется несколько подряд идущих символов «ненужных дефолтных разделителей полей»? А у тебя они будут отгрызаться и заменяться одним пробелом.

Тут без изменения входного формата, имхо, никак. Для [g]awk нужен единый разделитель для всех полей. А в твоей задаче, по сути, часть полей разделяется одним, а последнее поле другим.

blexey ★★★★★
()
Ответ на: комментарий от blexey

> Ну а если в последнем «столбце» окажется несколько подряд идущих символов «ненужных дефолтных разделителей полей»? А у тебя они будут отгрызаться и заменяться одним пробелом.

Знаю, но черт с ними. В конкретно данном случае это не критично.

Тут без изменения входного формата, имхо, никак. Для [g]awk нужен единый разделитель для всех полей. А в твоей задаче, по сути, часть полей разделяется одним, а последнее поле другим.

Задача «разбить по разделителю, но не больше, чем на N столбцов» встречается при парсинге самых разнообразных данных. В Руби мне довольно часто приходится прибегать к использованию аргумента limit в вызове String.split. Очень жаль, что в awk поддержка этой возможности не встроена.

geekless ★★
() автор топика

awk - вполне себе язык программирования, там можно написать всё что хочешь. perl конечно поудобнее будет, но awk полегче в загрузке и входит в состав базового юникса.

gena2x ★★★
()
Ответ на: комментарий от geekless

geekless> Прямого способа нет.


$ cat test1.awk

function uptofield(from, to) {
    str=""
    for (i=from;i<to;i++) {
       str=sprintf("%s%s%s", str, $i, FS)
    }
  return str$to
}

{ print uptofield(f,t) }

$ cat /etc/passwd | awk -F: -vf=2 -vt=4 -f test1.awk
{skip}
x:106:114
x:113:127
x:117:130
x:110:120
           

sdio ★★★★★
()
Ответ на: комментарий от sdio

ЛОР не перестаёт веселить. Каждый раз, когда спрашиваешь: «Мужики, а программа P поддерживает фичу F?» и оказывается, что не поддерживает, то вместо того, чтобы на этом и закончить тред, в него набегают толпы «профессионалов» в попытках доказать... а что, собственно, доказать-то? Хз.

Вот ты прицепился к моей фразе «Прямого способа нет» и нарисовал еще один костыль к полудюжине тех, что были рассмотрены выше. И что ты этим хотел сказать? Спасибо тебе за старания, но свой костяль я использовал уже 2 часа назад, и в рамках задачи он меня устраивает.

И нет — это не «прямой способ». Прямым способом бы было:

$ awk --max-fields=5 '{somecode...}'
Или:
$ awk 'BEGIN{MAX_COL=5} {somecode...}'
Или даже:
$ awk '{split_max($0, colums, /\s+/, 5) ...}'
Но ничего из подобных вещей gawk не умеет.

geekless ★★
() автор топика
Ответ на: комментарий от geekless

geekless> Прямым способом бы было:

Ты когда нормальный, а когда и просто дебил упрямый.

1. Прямым способом было бы выбрать адекватный ТВОИМ запросам язык.

2. Мой способ: функция на языке awk (по ТЗ), учитывает разделитель и берет нужное кол-во полей --- не костыль

3. Твой способ: натуральный костыль, не учитывает ни кол-ва полей, ни разделитель, да еще и добавляет пробелы в конце строки --- наикостылище достойное звания почетного быдлокодера.

Спасибо за внимание.

sdio ★★★★★
()
Ответ на: комментарий от sdio

А чо ты разнервничался-то?

1. Прямым способом было бы выбрать адекватный ТВОИМ запросам язык.

Такой вот я м^Hчудак, что думаю о пользователях. О вас, дорогие мои, которые набигают с криками «АААА, программа юзает Руби/Питон/Перл!!! АААА!!!»

Ты никогда не задумывался, что СТАНДАРТНОСТЬ наличия интерпретатора в системе тоже может являться частью требований к языку?

2. Мой способ: функция на языке awk (по ТЗ), учитывает разделитель и берет нужное кол-во полей --- не костыль

Героически преодолевать ограничения инструмента — костыль.

3. Твой способ: натуральный костыль, не учитывает ни кол-ва полей, ни разделитель, да еще и добавляет пробелы в конце строки --- наикостылище достойное звания почетного быдлокодера.

Разделителями служат пробелы. Больше десяти слов в столбце невероятно маловероятны. Количество пробелов между словами и в хвосте не является смыслоразличительным. Поэтому всё твои претензии абсолютно не по делу.

Но если уж ты заговорил о признаках костыльности, то твой код не восстанавливает точные варианты разделителей между полями. Т.е. по твоей же системе оценок — костыль.

Спасибо за внимание.

Пожалуйста. Обращайся еще.

geekless ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.