Напечатать поле 'N' до конца строки - PullRequest
2 голосов
/ 10 июня 2011

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

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

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

Лучший, jianfeng.mao

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

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

Ответы [ 4 ]

5 голосов
/ 10 июня 2011

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

поле1 поле2 поле3 поле4 поле5 поле6
поле1 поле2 поле3 поле4 поле5 поле6 поле7
поле1 поле2 поле3 поле4 поле5 поле5 поле6field7 field 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 поле7 поле 8

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

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

Точно так же будет и сокращение.

cut -f6 temp.txt

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

4 голосов
/ 10 июня 2011

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

awk -F "\t" '{ for (i=6; i<=NF; ++i) $(i-5) = $i; NF = NF-5; print; }
2 голосов
/ 10 июня 2011

perl way?

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

так

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

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

field6
1 голос
/ 19 апреля 2012
awk -vFS='\t' -vOFS='\t' '{
  $1=$2=$3=$4=$5=""
  print substr($0,6) # delete leading tabs
}'

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

...