As opções 1 a 3 apresentam problemas com vários espaços em branco (mas são simples). Essa é a razão para desenvolver as opções 4 e 5, que processam vários espaços em branco sem nenhum problema. Obviamente, se as opções 4 ou 5 forem usadas com n=0
ambas, os espaços em branco à esquerda serão preservados, o que n=0
significa que não haverá divisão.
Opção 1
Uma solução de corte simples (funciona com delimitadores simples):
$ echo '1 2 3 4 5 6 7 8' | cut -d' ' -f4-
4 5 6 7 8
opção 2
Forçar um recálculo do awk às vezes resolve o problema (funciona com algumas versões do awk) de espaços iniciais adicionados:
$ echo '1 2 3 4 5 6 7 8' | awk '{ $1=$2=$3="";$0=$0;} NF=NF'
4 5 6 7 8
Opção 3
Imprimir cada campo formatado com printf
dará mais controle:
$ echo ' 1 2 3 4 5 6 7 8 ' |
awk -v n=3 '{ for (i=n+1; i<=NF; i++){printf("%s%s",$i,i==NF?RS:OFS);} }'
4 5 6 7 8
No entanto, todas as respostas anteriores alteram todos os FS entre os campos para OFS. Vamos construir algumas soluções para isso.
Opção 4
Um loop com sub para remover campos e delimitadores é mais portátil e não aciona uma mudança de FS para OFS:
$ echo ' 1 2 3 4 5 6 7 8 ' |
awk -v n=3 '{ for(i=1;i<=n;i++) { sub("^["FS"]*[^"FS"]+["FS"]+","",$0);} } 1 '
4 5 6 7 8
NOTA: O "^ [" FS "] *" é para aceitar uma entrada com espaços à esquerda.
Opção 5
É bem possível construir uma solução que não adicione espaços em branco extras à esquerda ou à direita e preserve os espaços em branco existentes usando a função gensub
do GNU awk, como este:
$ echo ' 1 2 3 4 5 6 7 8 ' |
awk -v n=3 '{ print gensub("["FS"]*([^"FS"]+["FS"]+){"n"}","",1); }'
4 5 6 7 8
Também pode ser usado para trocar uma lista de campos dada uma contagem n
:
$ echo ' 1 2 3 4 5 6 7 8 ' |
awk -v n=3 '{ a=gensub("["FS"]*([^"FS"]+["FS"]+){"n"}","",1);
b=gensub("^(.*)("a")","\\1",1);
print "|"a"|","!"b"!";
}'
|4 5 6 7 8 | ! 1 2 3 !
Obviamente, nesse caso, o OFS é usado para separar as duas partes da linha e o espaço em branco posterior dos campos ainda é impresso.
Nota1: ["FS"]*
é usado para permitir espaços à esquerda na linha de entrada.
cut -f3-
?