Tenho um arquivo /tmp/a.txt
com o seguinte conteúdo:
1
2
3
4
5
Usando AWK
, quero solicitar ao usuário que especifique um intervalo em qualquer um dos formatos a seguir e imprima as linhas correspondentes.
separados por vírgula
1,2,3
espaço separado
1 2 3
e no alcance usando -
1-3
Saída esperada:
1
2
3
Abaixo está o exemplo de comando awk para capturar a entrada do usuário, o que devo colocar aqui para obter a saída necessária.
awk 'BEGIN { printf "Enter the range: " ; getline name < "-" }{?}' /tmp/a.txt
Você pode usar este
awk
comando:Explicação:
printf "Enter the range: " ; getline r < "-";
copiado da pergunta (para ler a entrada do usuário na variávelr
)split(r,a,"[ ,]")
divida a entrada em delimitadores espaço e vírgula e escreva-os em arraya
.for (i in a)
Para cada processo de linha awk, ele faz um loop pelo arraya
split(a[i],b,"-")
cada elemento ema
é dividido novamente no delimitador-
e o intervalo é salvo em arrayb
.if(a[i]==NR||(b[2]!=""&&b[1]<=NR&&b[2]>=NR))
se o número da linha queawk
está sendo processado no momento estiver na matriza
ou se o número da linha estiver entre os dois números na matrizb
...{print}
... imprima a linha.Você também pode usar a entrada combinada como
Não está muito claro se você deseja que os números da linha (
NR
) correspondam aos intervalos inseridos, ou os valores da linha inteira ($0
), ou do primeiro campo ($1
)... Tentee mude
$1
para$0
ouNR
.