Как разбить строку , если она содержит символы трубы |
в нем. Я хочу разделить их, чтобы быть в массиве.
Я попытался
echo "12:23:11" | awk '{split($0,a,":"); print a[3] a[2] a[1]}'
Который работает отлично. Если моя строка похожа, "12|23|11"
то как мне разбить их на массив?
OFS
, вставьте между ними запятые, чтобы ониprint
рассматривались как отдельные аргументы.echo "12:23:11" | sed "s/.*://"
echo "12:23:11" | sed "s/.*://"
) удаляет все до (и включая) последнего «:», оставляя только «11» ... она работает, чтобы получить последнее число, но должна быть изменена (трудно читаемым способом), чтобы получить 2-й номер и т. д. awk (и разделение awk) гораздо более элегантно и читабельно.cut
Ответы:
Ты пробовала:
источник
split
- это регулярное выражение и|
специальный символ, который необходимо экранировать. Использованиеsplit($0, a, "\|")
|
он рассматривается как символ, а не как специальный символ, - поместить его между[]
: т.е.split($0, a, "[|]")
# мне нравится это лучше, чем '\ |', в некоторых случаях, особенно как вариант regexp ( Perl против grep против .. других?) может иметь "|" в буквальном смысле и "\ |" рассматривается как разделитель регулярных выражений, а не наоборот ... ymmvЧтобы разбить строку на массив,
awk
мы используем функциюsplit()
:Если разделитель не указан, используется значение по
FS
умолчанию, равное пробелу:Мы можем дать разделитель, например
:
:Что эквивалентно установке через
FS
:В gawk вы также можете указать разделитель как регулярное выражение:
И даже посмотрите, какой разделитель был на каждом шаге, используя его четвертый параметр:
Давайте процитируем man-страницу GNU awk :
источник
Пожалуйста, будьте более конкретны! Что вы подразумеваете под "это не работает"? Отправьте точный вывод (или сообщение об ошибке), вашу ОС и версию awk:
Или, используя split:
Редактировать: в Solaris вам нужно использовать POSIX awk ( / usr / xpg4 / bin / awk ) для правильной обработки 4000 полей.
источник
for(i = 0
илиfor(i = 1
?for (i = 1; i <= n; ++i)
...Мне не нравится
echo "..." | awk ...
решение, так как оно вызывает ненужныеfork
иexec
системные вызовы.Я предпочитаю решение Димитра с небольшим поворотом
Или немного более короткая версия:
В этом случае выходная запись соединяется, что является истинным условием, поэтому она печатается.
В этом конкретном случае
stdin
перенаправление можно избежать, установивAWK внутренняя переменная:я использовал КШ довольно долго, но в ударэто можно сделать с помощью внутренней обработки строк. В первом случае исходная строка разделяется внутренним терминатором. Во втором случае предполагается, что строка всегда содержит пары цифр, разделенные разделителем из одного символа.
Результат во всех случаях
источник
bash
выражении ...На самом деле
awk
имеет функцию под названием «Поле ввода Сепаратор Variable» ссылка . Вот как это использовать. Это не совсем массив, но он использует внутренние переменные $. Разбить простую строку проще.источник
должно сработать.
источник
источник
Шутка? :)
Как насчет
echo "12|23|11" | awk '{split($0,a,"|"); print a[3] a[2] a[1]}'
Это мой вывод:
так что я думаю, что это работает в конце концов ..
источник
Я знаю, что это довольно старый вопрос, но я подумала, может, кому-то понравится мой трюк. Тем более что это решение не ограничено конкретным количеством предметов.
Выход будет:
источник