grep '^\(.\{4\}\|.\{24\}\)\*' X
Encontre todas as linhas se o arquivo X contiver um asterisco (entre aspas porque em uma expressão regular significa zero ou mais do átomo precedente) precedido por 4 ou 24 caracteres desde o início da linha.
Eu estou procurando uma maneira de percorrer arquivos de texto de formato fixo e procurando por um caractere específico em uma ou várias posições de caracteres específicos, incluindo a posição do primeiro caractere, dentro de qualquer linha de dados no arquivo. Se qualquer uma dessas posições atender aos critérios de caractere, eu quero produzir esse registro / linha. Alguém tem um comando grep ou awk que faria isso? Por exemplo, se eu estou procurando por um asterisco (*) na posição 5 ou 10 ou 25 do arquivo X, como isso seria feito em awk ou grep? Exemplo de arquivo
cat test.txt
* * *
* X *
* * Y
* X Y
grep '^\(.\{4\}\|.\{24\}\)\*' X
Encontre todas as linhas se o arquivo X contiver um asterisco (entre aspas porque em uma expressão regular significa zero ou mais do átomo precedente) precedido por 4 ou 24 caracteres desde o início da linha.
Provavelmente, a seguinte linha awk
ajudará você a entender melhor
printf '%s\n' "foo bar *" foo "more foo * more * foo and baz" "another foo bar foo" | awk '{for (i=1;i<=NF;i++) if ($i=="*") print $i " appears in field: " i}'
Tão simples quanto percorrer os campos, combinando o campo com o padrão e imprimindo-o
Com pelo menos gawk
e mawk
, você pode tratar cada caractere como um campo, definindo um separador de campo vazio. Então, por exemplo, você pode fazer
gawk -F '' '$5 == "*" || $10 == "*"' test.txt
que faz com que os registros correspondentes (linhas) sejam impressos usando a regra de impressão padrão.
Um truque semelhante em perl
(observe que os campos são indexados com zero)
perl -F'' -ane 'print if $F[4] eq "*" || $F[9] eq "*"' test.txt