AWK para imprimir linhas correspondentes à entrada do usuário inserida em algum formato específico, faixa etc.

2

Eu tenho um arquivo /tmp/a.txt com o seguinte conteúdo:

1
2
3
4
5

Usando AWK , desejo solicitar que o usuário especifique um intervalo em qualquer um dos formatos a seguir e imprima as linhas correspondentes.

separado por vírgulas

1,2,3

separado por espaço

1 2 3

e no intervalo usando -

1-3

Resultado esperado:

1
2
3

Abaixo está o exemplo do 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
    
por Bharat 27.08.2018 / 10:27

3 respostas

0

Você pode usar este comando awk :

awk 'BEGIN { printf "Enter the range: " ; getline r < "-"; split(r,a,"[ ,]")} \
  {for (i in a){split(a[i],b,"-"); if(a[i]==NR||(b[2]!=""&&b[1]<=NR&&b[2]>=NR)){print}}}' file

Explicação:

  • printf "Enter the range: " ; getline r < "-"; copiado da pergunta (para ler a entrada do usuário na variável r )
  • split(r,a,"[ ,]") divide a entrada no espaço e vírgula dos delimitadores e grava-os no array a .
  • for (i in a) Para cada linha awk processa, faz um loop pelo array a
    • split(a[i],b,"-") cada elemento em a é dividido novamente no delimitador - e o intervalo é salvo na matriz b .
    • if(a[i]==NR||(b[2]!=""&&b[1]<=NR&&b[2]>=NR)) se o número da linha awk estiver processando atualmente na matriz a ou se o número da linha estiver entre os dois números na matriz b ...
      • {print} ... imprima a linha.

Você também pode usar entradas combinadas como

1-3,4 5 7-13
    
por 27.08.2018 / 12:06
1

Você pode conseguir não exatamente o que deseja, mas semelhante a algo como:

awk -vnums="$Userinput" 'nums ~ "\<"NR"\>"' infile

Ele não verifica quais números de caracteres são delimitados e não entende o intervalo adequadamente, mas funciona bem, talvez você possa estender isso para reconhecer e expandir os intervalos para os números exatos e depois imprimir (eu dou esta parte para você) .

teste:

Userinput='4-53,5  0'; awk -F'[-  ]' -vnums="$Userinput" 'nums ~ "\<"NR"\>"' infile
4
5
    
por 27.08.2018 / 11:03
0

Não está claro se você deseja que os números da linha ( NR ) correspondam aos intervalos inseridos ou aos valores da linha inteira ( $0 ) ou do primeiro campo ( $1 ) ... Experimente

awk '
BEGIN   {printf "Enter the range: "
         getline ANS < "/dev/tty"
         for (n=split (ANS, T, "[ ,]"); n; n--) {for (m=split (T[n], R, "-"); m; m--)   TGT[R[m]]
                                                 for (i=R[1]+1; i<R[2]; i++)            TGT[i]
                                                }
        }
$1 in TGT
' file
Enter the range: 1-3
1
2
3

e altere $1 para $0 ou NR .

    
por 27.08.2018 / 13:13

Tags