web-dev-qa-db-fra.com

Comment trouver une «chaîne» spécifique et imprimer toute la ligne?

J'ai un fichier nommé myfile.csv contenant les éléments suivants:

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

Depuis le terminal I Run ./myscript.sh def

Le contenu de myscript.sh est:

#!/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"

Je souhaite que le code recherche le mot def ou tout autre mot dans le premier paramètre dans le myfile.csv IE abc ou StackExchange. Une fois trouvé, j'aimerais que cela prenne toute la gamme sans les sépérateurs et la placerait dans le my_variable variable et l'écho sur le terminal (donc la sortie ressemblerait à: def 423324 arbitrary value string lorsque ./myscript.sh def est entré sur le terminal. Lorsque ./myscript.sh StackExchange la sortie serait StackExchange Unix Linux).

Où est-ce que je vais mal? Y a-t-il une alternative?

5
3kstc

Voici un sed alternative:

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

Si vous passez la chaîne comme premier paramètre de position:

sed -n "/^$1:/s/:/ /gp" myfile.csv
3
heemayl

À travers 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

Il suffit d'exécuter le script ci-dessus sur la borne avec le mot clé de recherche en tant qu'argument de FIRS et le nom du fichier en tant que deuxième argument.

0
Avinash Raj

Voici une solution utilisant Grep:

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

0
Md Abrar