Como pesquisar dentro de um intervalo específico de posições em uma linha

3

Eu tenho um arquivo de texto com 60 posições de caracteres. Eu quero ser capaz de procurar por um valor / palavra inserida pelo usuário nas posições 05-12. Como faço para fazer isso sem usar awk, pearl, etc?

Por exemplo, o arquivo de texto é

commA6314   ifosfamide               30     12 

home5341209 urokinase    6314               37

E se alguém inserir 6314 , então a saída será

commA6314   ifosfamide               30     12

Eu estava pensando em usar grep , mas não tenho certeza. Alguma ajuda?

    
por JVAN 01.03.2017 / 23:42

2 respostas

2

Você poderia usar

grep -E "^.{4}.?.?.?.?.?.?.?$pattern" 

onde $pattern é a entrada do usuário, quero dizer, em algo como

$ echo "enter a pattern: "; read pattern; grep -E "^.{4}.?.?.?.?.?.?.?$pattern" file
enter a pattern: 
6314
commA6314   ifosfamide               30     12 

^.{4}.?.?.?.?.?.?.? que são os primeiros 4 caracteres bloqueados, então os próximos 7 caracteres são opcionais, significando que se o padrão for apenas um caractere e estiver na 12ª posição, ele será encontrado e se tiver 7 caracteres e será iniciado a partir do 5ª posição, ainda seria encontrado.

  • ^ início da linha
  • . qualquer caractere
  • {4} quatro do caractere anterior
  • ? zero ou um dos caracteres anteriores
por Zanna 02.03.2017 / 00:24
2

Bash permite extrair sub-strings de variável específica. Tudo que você precisa fazer é ler o arquivo linha por linha em while IFS= read -r estrutura:

#!/bin/bash
while IFS= read -r line;
do
    if [[ ${line:5:12} =~ "" ]];
    then
        echo "$line"
    fi
done < ""

Observe a sintaxe: em ${var:5:12} 5 é a posição inicial e 12 é compensada, então neste caso ele busca da posição 5 até 17. Se você precisar calcular o deslocamento com base na entrada do usuário, você pode usar o bash aritmética para determinar off-set como end=$((12-5)) e usar essa variável dentro da expressão de subcadeia como ${var:5:$end}

Execução de teste:

$ ./search_substrings.sh "6314" input.txt                                                                                
commA6314   ifosfamide               30     12  

Observe que isso evita o uso de ferramentas externas como grep , que atende aos requisitos, embora tenha em mente que essa não é uma solução muito prática e, no mundo real, você prefere usar Perl ou awk

    
por Sergiy Kolodyazhnyy 02.03.2017 / 01:29