Использование awk для печати всех столбцов от n-го до последнего - PullRequest
270 голосов
/ 03 июня 2010

Эта строка работала, пока во втором поле не было пробелов.

svn status | grep '\!' | gawk '{print $2;}' > removedProjs

есть ли способ заставить awk распечатать все за 2 доллара или больше? (3 доллара, 4 доллара ... пока у нас больше не будет столбцов?)

Полагаю, мне следует добавить, что я делаю это в среде Windows с Cygwin.

Ответы [ 24 ]

0 голосов
/ 17 октября 2013

Perl:

@m=`ls -ltr dir | grep ^d | awk '{print \$6,\$7,\$8,\$9}'`;
foreach $i (@m)
{
        print "$i\n";

}
0 голосов
/ 18 января 2018

Я хочу расширить предлагаемые ответы на ситуацию, когда поля разделены, возможно, несколькими пробелами - причину, по которой ОП не использует cut Полагаю,

Я знаю, что ОП спрашивал о awk, но подход sed сработал бы здесь (пример с печатью столбцов с 5-го по последний):

  • чистый подход sed

    sed -r 's/^\s*(\S+\s+){4}//' somefile
    

    Пояснение:

    • s/// используется стандартный способ выполнения замены
    • ^\s* соответствует любому последовательному пробелу в начале строки
    • \S+\s+ означает столбец данных (непробельные символы, за которыми следуют пробельные символы)
    • (){4} означает, что шаблон повторяется 4 раза.
  • Сед и вырезать

    sed -r 's/^\s+//; s/\s+/\t/g' somefile | cut -f5-
    

    путем простой замены последовательных пробелов на одной вкладке;

  • тр и нарезать: tr также можно использовать для сжатия последовательных символов с опцией -s.

    tr -s [:blank:] <somefile | cut -d' ' -f5-
    
0 голосов
/ 15 июня 2018

Из-за неправильного ответа большинства проголосовавших с 340 голосами я потерял 5 минут своей жизни! Кто-нибудь пробовал этот ответ перед голосованием? Очевидно, нет. Совершенно бесполезно.

У меня есть журнал, где после 5 долларов с IP-адресом может быть больше текста или нет текста. Мне нужно все, от IP-адреса до конца строки, если что-то будет после 5 долларов. В моем случае это на самом деле в программе awk, а не в awk oneliner, поэтому awk должен решить проблему. Когда я пытаюсь удалить первые 4 поля, используя самый голосующий, но совершенно неправильный ответ:

echo "  7 27.10.16. Thu 11:57:18 37.244.182.218" | awk '{$1=$2=$3=$4=""; printf "[%s]\n", $0}'

выдает неправильный и бесполезный ответ (я добавил [..] для демонстрации):

[    37.244.182.218 one two three]

Есть даже некоторые предположения, чтобы объединить substr с этим неправильным ответом. Как это осложнение является улучшением.

Вместо этого, если столбцы имеют фиксированную ширину до точки обрезки и awk, правильный ответ:

echo "  7 27.10.16. Thu 11:57:18 37.244.182.218" | awk '{printf "[%s]\n", substr($0,28)}'

, который выдает желаемый результат:

[37.244.182.218 one two three]
0 голосов
/ 16 апреля 2014

Если вы не хотите переформатировать часть строки, которую не отрываете, лучшее решение, которое я могу придумать, написано в моем ответе:

Как напечатать все столбцы после определенного числа с помощью awk?

Он прерывает то, что находится перед заданным номером поля N, и печатает всю оставшуюся часть строки, включая номер поля N и поддерживая исходный интервал (он не форматируется) Не имеет значения, если строка поля появляется также где-то еще в строке.

Определить функцию:

fromField () { 
awk -v m="\x01" -v N="$1" '{$N=m$N; print substr($0,index($0,m)+1)}'
}

И используйте это так:

$ echo "  bat   bi       iru   lau bost   " | fromField 3
iru   lau bost   
$ echo "  bat   bi       iru   lau bost   " | fromField 2
bi       iru   lau bost 

Вывод поддерживает все, включая конечные пробелы

В вашем конкретном случае:

svn status | grep '\!' | fromField 2 > removedProjs

Если ваш файл / поток не содержит символов новой строки в середине строк (возможно, вы используете другой разделитель записей), вы можете использовать:

awk -v m="\x0a" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}'

Первый случай завершится ошибкой только в файлах / потоках, которые содержат редкий шестнадцатеричный символ числа 1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...