Como encontrar uma 'string' específica e imprimir toda a linha?

5

Eu tenho um arquivo chamado myfile.csv contendo o seguinte:

 abc:123:myname:1231
 def:423324:arbitrary:value:string
 StackExchange:Unix:Linux

Do terminal, corro ./myscript.sh def

O conteúdo de myscript.sh é:

#!/bin/bash
key_word_I_am_looking_for=$1
my_variable='cat myfile.csv | awk -F: -v keyword="$key_word_I_am_looking_for" '( $1 == keyword )' END{print "$@" }''
echo "$my_variable"

Eu quero que o código pesquise a palavra def ou qualquer outra palavra no primeiro parâmetro no myfile.csv ie abc ou StackExchange . Uma vez encontrado, eu gostaria que ele retirasse a linha inteira sem os separadores e a colocasse na variável my_variable , e a fizesse ecoar no terminal (assim a saída ficaria como: def 423324 arbitrary value string quando ./myscript.sh def é digitado para o terminal. Quando ./myscript.sh StackExchange a saída seria StackExchange Unix Linux ).

Onde estou indo errado? Existe uma alternativa?

    
por 3kstc 11.04.2015 / 17:31

4 respostas

9

Sua sintaxe do awk está um pouco errada.

#!/bin/bash
awk -F: -v keyword="$1" '$1 == keyword {$1=$1; print}' myfile.csv

O truque aqui é reatribuir o valor de um dos campos force awk para recalcular $ 0 usando o separador de arquivo de saída. Aqui, o OFS padrão é um espaço, portanto, atribuir o valor de $ 1 a ele altera os dois pontos para espaços.

Uma maneira não-esquisita de escrever isso é:

grep "^$1:" myfile.csv | tr ":" " "

mas que usa correspondência de expressão regular, não igualdade de string

    
por 11.04.2015 / 17:41
3

Aqui está uma alternativa sed :

sed -n '/^def:/s/:/ /gp' myfile.csv

Se você passar a string como primeiro parâmetro posicional:

sed -n "/^$1:/s/:/ /gp" myfile.csv
    
por 12.04.2015 / 02:05
0

Através do python.

$ python -c "import sys;
with open(sys.argv[2]) as f:
    for line in f:
        if sys.argv[1] == line.split(':')[0]:
            print ' '.join(line.strip().split(':'))" def file
def 423324 arbitrary value string

Basta executar o script acima no terminal com a palavra-chave search como argumento firs e o nome do arquivo como segundo argumento.

    
por 12.04.2015 / 04:56
0

Aqui está uma solução usando o grep:

grep ^abc file | awk -F ":" '{print $1" " $2" " $3" " $4}'

    
por 21.02.2018 / 12:11