Эта строка работала, пока у меня не было пробелов во втором поле.
svn status | grep '\!' | gawk '{print $2;}' > removedProjs
Есть ли способ заставить awk распечатать все в $ 2 или больше? (3 доллара, 4 доллара ... пока у нас больше не будет столбцов?)
Я полагаю, я должен добавить, что я делаю это в среде Windows с Cygwin.
grep | awk
это антипаттерн - вы хотитеawk '/!/ { print $2 }'
svn status | grep '\!' | cut -d' ' -f2- > removedProjs
Ответы:
напечатает все, кроме самого первого столбца:
напечатает все, кроме двух первых столбцов:
источник
awk '{$1=""; print substr($0,2)}' input_filename > output_filename
awk -F, -vOFS=, '{$1=""; print $0}'
вы получите начальный разделитель ($1
по-прежнему включен, как пустая строка). Вы можете удалить это с помощьюsed
:awk -F, -vOFS=, '{$1=""; print $0}' | sed 's/^,//'
Есть дублирующий вопрос с более простым ответом, используя сокращение:
-d
указывает разделитель (пробел) ,-f
указывает список столбцов (все начинаются со 2-го)источник
awk
версия, существуют проблемы с буферизацией строкиcut
, которыеawk
не имеют: stackoverflow.com/questions/14360640/…awk
рассматривает несколько смежных пробелов. как отдельный разделитель, покаcut
нет; также - хотя это не проблема в данном случае -cut
принимает только один буквенный символ. в качестве разделителя, тогда какawk
позволяет регулярное выражение.Вы можете использовать цикл for для циклического прохождения полей печати от $ 2 до $ NF (встроенная переменная, которая представляет количество полей в строке).
Изменить: так как «печать» добавляет новую строку, вы хотите буферизировать результаты:
В качестве альтернативы используйте printf:
источник
'{for(i=11;i<=NF-1;i++){printf "%s ", $i}; print $NF;}'
без начальных и конечных пробелов.Мой ответ основан на ответе VeeArr , но я заметил, что он начался с пробела, перед тем как напечатать второй столбец (и остальные). Поскольку у меня есть только 1 очко репутации, я не могу это прокомментировать, поэтому здесь это выглядит как новый ответ:
начните с «out» в качестве второго столбца, а затем добавьте все остальные столбцы (если они существуют). Это идет хорошо, пока есть второй столбец.
источник
Большинство решений с awk оставляют место. Варианты здесь позволяют избежать этой проблемы.
Опция 1
Простое решение для резки (работает только с одиночными разделителями):
Вариант 2
Принудительный пересчет awk иногда удаляет добавленный начальный пробел (OFS), оставленный путем удаления первых полей (работает с некоторыми версиями awk):
Вариант 3
Печать каждого поля, отформатированного с помощью
printf
, даст больше контроля:Однако все предыдущие ответы меняют все повторяющиеся FS между полями на OFS. Давайте создадим пару вариантов, которые этого не делают.
Вариант 4 (рекомендуется)
Цикл с подпрограммой для удаления полей и разделителей спереди.
И используя значение FS вместо пробела (который можно изменить).
Является более переносимым и не вызывает смену FS на OFS: ПРИМЕЧАНИЕ .
^[FS]*
Принимает ввод с начальными пробелами.Вариант 5
Вполне возможно построить решение, которое не добавляет лишние (начальные или конечные) пробелы и сохраняет существующие пробелы, используя функцию
gensub
из GNU awk, как это:Он также может быть использован для замены группы полей по количеству
n
:Конечно, в таком случае OFS используется для разделения обеих частей линии, и завершающий пробел полей по-прежнему печатается.
ПРИМЕЧАНИЕ:
[FS]*
используется для разрешения начальных пробелов в строке ввода.источник
Я лично попробовал все ответы, упомянутые выше, но большинство из них были немного сложными или просто не правы. Самый простой способ сделать это с моей точки зрения:
Где -F "" определяет разделитель для использования в awk. В моем случае это пробел, который также является разделителем по умолчанию для awk. Это означает, что -F "" можно игнорировать.
Где NF определяет общее количество полей / столбцов. Поэтому цикл начнется с 4-го поля до последнего поля / столбца.
Где $ N возвращает значение N-го поля. Поэтому print $ i будет печатать текущее поле / столбец на основе количества циклов.
источник
Lauhub предложил это правильное, простое и быстрое решение здесь
источник
Это меня очень раздражало, я сел и написал
cut
парсер спецификации, похожий на полевой, протестированный с GNU Awk 3.1.7.Сначала создайте новый скрипт библиотеки Awk с именем
pfcut
, например:Затем вставьте скрипт ниже и сохраните. После этого, вот как выглядит использование:
Чтобы избежать всего этого, я думаю, что лучшее, что можно сделать (см. Иначе Автоматически загружать пользовательскую функцию при запуске с awk? - Unix & Linux Stack Exchange ) - добавить псевдоним
~/.bashrc
; например с:... тогда вы можете просто позвонить:
Вот источник
pfcut
скрипта:источник
cut
, а неawk
Распечатка столбцов, начиная с # 2 (вывод не будет заканчиваться пробелом в начале):
источник
+
после пробела, так как поля могут быть разделены более чем 1 пробелом (awk
обрабатывает несколько смежных пробелов как один разделитель). Кроме того,awk
будет игнорировать начальные пробелы, поэтому вы должны начать регулярное выражение с^[ ]*
. С пространством в качестве разделителя вы можете даже обобщить решение; Например, следующее возвращает все из 3-го поля:awk '{sub(/^[ ]*([^ ]+ +){2}/, ""); print $0}'
Однако становится сложнее с произвольными разделителями полей.Будет ли это работать?
Это оставляет некоторые пробелы впереди, хотя.
источник
этот использует awk для печати всех, кроме последнего поля
источник
Это то, что я предпочел из всех рекомендаций:
Печать с 6-го по последний столбец.
или
источник
Если вам нужны определенные столбцы, напечатанные произвольным разделителем:
Поэтому, если у вас есть пробел в столбце, это будет два столбца, но вы можете связать его с любым разделителем или без него.
источник
Perl решение:
Эти параметры командной строки используются:
-n
цикл вокруг каждой строки входного файла, не печатать автоматически каждую строку-l
удаляет символы новой строки перед обработкой и добавляет их обратно после-a
режим автоматического разделения - разбить входные строки в массив @F. По умолчанию расщепление по пробелам-e
выполнить код Perlsplice @F,0,1
чисто удаляет столбец 0 из массива @Fjoin " ",@F
объединяет элементы массива @F, используя пробел между каждым элементомРешение Python:
python -c "import sys;[sys.stdout.write(' '.join(line.split()[1:]) + '\n') for line in sys.stdin]" < file
источник
Если вы не хотите переформатировать часть строки, которую не отрываете, лучшее решение, которое я могу придумать, написано в моем ответе:
Как напечатать все столбцы после определенного числа с помощью awk?
Он прерывает то, что находится перед заданным номером поля N, и печатает всю оставшуюся часть строки, включая номер поля N и поддерживая исходный интервал (он не переформатируется). Не имеет значения, если строка поля появляется также где-то еще в строке.
Определить функцию:
И используйте это так:
Вывод поддерживает все, включая пробелы
В вашем конкретном случае:
Если ваш файл / поток не содержит символов новой строки в середине строк (возможно, вы используете другой разделитель записей), вы можете использовать:
В первом случае произойдет сбой только в файлах / потоках, которые содержат редкий шестнадцатеричный символ номер 1
источник
Это сработает, если вы используете Bash и можете использовать столько символов «x», сколько элементов вы хотите отбросить, и он игнорирует несколько пробелов, если они не экранированы.
источник
Perl:
источник
Эта
awk
функция возвращает подстроку$0
, включающую поля отbegin
доend
:Чтобы получить все, начиная с поля 3:
Чтобы получить раздел,
$0
который охватывает поля с 3 по 5:b, e, p, i
ерунда в списке параметров функции - это простоawk
способ объявления локальных переменных.источник
Я хочу расширить предлагаемые ответы на ситуацию, когда поля ограничены возможно несколькими пробелами -
cut
я полагаю, причина, по которой OP не использует .Я знаю, что ОП спрашивал
awk
, ноsed
подход будет работать здесь (пример с печатью столбцов от 5-го до последнего):чистый сед подход
Объяснение:
s///
используется стандартный способ выполнения замены^\s*
соответствует любому последовательному пробелу в начале строки\S+\s+
означает столбец данных (непробельные символы с последующими пробельными символами)(){4}
означает, что шаблон повторяется 4 раза.седь и режь
просто заменяя последовательные пробелы одной вкладкой;
tr и cut:
tr
также можно использовать для сжатия последовательных символов с помощью-s
опции.источник
Примеры Awk здесь выглядят сложными, вот простой синтаксис оболочки Bash:
Где
1
ваш n- й столбец, считая от 0.пример
Учитывая это содержимое файла (
in.txt
):вот вывод:
источник
Мне не понравилось ни одно из
awk
представленных здесь решений, потому что я хотел извлечь первые несколько столбцов, а затем распечатать остальные, поэтомуperl
вместо этого я обратился к ним . Следующий код извлекает первые два столбца и отображает остаток как есть:Преимущество по сравнению с
perl
решением Криса Кокната состоит в том, что на самом деле только первые n элементов отделяются от входной строки; остальная часть строки вообще не разделяется и поэтому остается полностью неповрежденной. Мой пример демонстрирует это с помощью сочетания пробелов и табуляции.Чтобы изменить количество столбцов, которые должны быть извлечены, замените
3
в примере на n + 1.источник
От этого ответа неплохо, но естественный интервал исчез.
Пожалуйста, сравните это с этим:
Тогда вы увидите разницу.
Даже то,
ls -la | awk '{$1=$2=""; print}'
что основано на ответе, проголосовавшем лучше всего, пока не сохраняет форматирование.Таким образом, я бы использовал следующее, и это также позволяет в начале явно выбирать столбцы:
Обратите внимание, что каждый пробел имеет значение и для столбцов, поэтому, например, в приведенных ниже столбцах 1 и 3 пусто, 2 - ИНФО, а 4 -:
источник
Если вы хотите отформатированный текст, объедините ваши команды с echo и используйте $ 0, чтобы напечатать последнее поле.
Пример:
Печать:
источник
Из-за неправильного ответа большинства проголосовавших с 340 голосами я потерял 5 минут своей жизни! Кто-нибудь пробовал этот ответ, прежде чем проголосовать? Очевидно, нет. Совершенно бесполезно.
У меня есть журнал, где после 5 долларов с IP-адресом может быть больше текста или нет текста. Мне нужно все, от IP-адреса до конца строки, если что-то будет после 5 долларов. В моем случае это на самом деле в программе awk, а не в awk oneliner, поэтому awk должен решить проблему. Когда я пытаюсь удалить первые 4 поля, используя самый голосующий, но совершенно неправильный ответ:
он выдает неправильный и бесполезный ответ (я добавил [..], чтобы продемонстрировать):
Есть даже некоторые предположения, чтобы объединить substr с этим неправильным ответом. Как это осложнение является улучшением.
Вместо этого, если столбцы имеют фиксированную ширину до точки обрезки и awk, правильный ответ:
который производит желаемый результат:
источник