Печатать поле «N» до конца строки

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

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

Не могли бы вы рассказать, как написать awk-скрипт для выполнения этой задачи?

Лучший, Цзяньфэн Мао

Обратите внимание на следующий добрый комментарий:

В моих файлах много полей. Разные строки имеют разное количество полей. Количество полей в строке не является стандартным.


person jianfeng.mao    schedule 10.06.2011    source источник
comment
у вас есть стандартный набор полей? или количество полей меняется. Например иногда 6 полей иногда 10 полей?   -  person matchew    schedule 10.06.2011
comment
Да полей много. Другой файл с другим количеством полей. Я не знаю, сколько их.   -  person jianfeng.mao    schedule 10.06.2011
comment
Не забудьте принять ответ, который ответил на ваш вопрос.   -  person ssapkota    schedule 11.06.2011
comment
Позвольте мне поприветствовать вас на StackOverflow и напомнить три вещи, которые мы обычно здесь делаем: 1) Когда вы получаете помощь, старайтесь также оказывать ее, отвечая на вопросы в вашей области знаний 2) Read the FAQs 3) Если вы видите хорошие вопросы и ответы, проголосуйте за них using the gray triangles, так как доверие к системе основано на репутации, которую пользователи получают, делясь своими знаниями. Также не забудьте принять ответ, который лучше решает вашу проблему, если таковой имеется, by pressing the checkmark sign   -  person Dr. belisarius    schedule 15.06.2011


Ответы (4)


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

awk -F "\t" '{ for (i=6; i<=NF; ++i) $(i-5) = $i; NF = NF-5; print; }
person Josh    schedule 10.06.2011
comment
Уважаемый пользователь 349433, сейчас я пытаюсь изучить ваш awk-скрипт. Большое спасибо - person jianfeng.mao; 10.06.2011

В моем файле с разделителями табуляции temp.txt это выглядит следующим образом

поле1 поле2 поле3 поле4 поле5 поле6
поле1 поле2 поле3 поле4 поле5 поле6 поле7
поле1 поле2 поле3 поле4 поле5 поле6 поле7 поле 8

Согласно вашему обновлению, я настоятельно рекомендую использовать cut:

cut -f6- temp.txt

будет печатать field6 до конца строки.

Примечание -d определяет разделитель, но табуляция является разделителем по умолчанию. Вы можете сделать это в awk, но я считаю, что cut проще.

С awk это будет выглядеть так:

 awk '{print substr($0, index($0, $6))}' temp.txt

, если мой файл temp.txt с разделителями табуляции выглядит следующим образом

поле1 поле2 поле3 поле4 поле5 поле6
поле1 поле2 поле3 поле4 поле5 поле6 поле7
поле1 поле2 поле3 поле4 поле5 поле6 поле7 поле 8

awk -F"\t" '{print $6}' temp.txt

будет печатать только 6-е поле. если разделителем является табуляция, он, скорее всего, будет работать без установки -F, но мне нравится устанавливать разделитель полей, когда я могу.

аналогично так бы тоже вырезал.

cut -f6 temp.txt

У меня есть подозрение, что ваш вопрос немного сложнее, чем этот, поэтому, если вы ответите на мой комментарий, я могу попытаться расширить свой ответ.

person matchew    schedule 10.06.2011
comment
Уважаемый матчев. Большое спасибо за вашу помощь. - person jianfeng.mao; 10.06.2011
comment
cut отлично подходит для простоты, но не обрабатывает несовместимые разделители (смесь разных пробелов). +1 за использование substr в решении awk. - person Shawn Chin; 10.06.2011

Перл способ?

perl -lane 'splice @F,0,5;print "@F"'

so,

echo 'field1 field2 field3 field4 field5 field6' | perl -lane 'splice @F,0,5;print "@F"'

будет производить

field6
person jm666    schedule 10.06.2011

awk -vFS='\t' -vOFS='\t' '{
  $1=$2=$3=$4=$5=""
  print substr($0,6) # delete leading tabs
}'

Я использую -vFS='\t', а не -F'\t', потому что некоторые реализации awk (например, BusyBox) не учитывают escape-символы C в последней конструкции.

person dubiousjim    schedule 19.04.2012