Je voudrais lire filein.txt (délimité par des tabulations) et sortir un fileout.txt avec seulement des lignes qui correspondent à la valeur d'une colonne donnée, et éliminer la colonne étant interrogé. c'est à dire.,
filein.txt
#name\thouse\taddress
roger\tvictorian\t223 dolan st.
maggie\tfrench\t12 alameda ave.
Kingston\tvictorian\t224 house st.
robert\tamerican\t22 dolan st.
Disons que je voudrais sélectionner uniquement les lignes où les maisons sont de style victorian
, alors mon fileout.txt devrait ressembler à:
fileout.txt
#name\taddress
roger\t223 dolan st.
Kingston\t224 house st.
awk -F"\t" '$2 == "victorian" { print $1"\t"$3 }' file.in
Vous pouvez le faire avec le script awk
suivant:
#!/bin/bash
style="victorian"
awk -v s_style=$style 'BEGIN{FS=OFS="\t"}
$2==s_style {$2=""; sub("\t\t","\t"); print}'
Explication:
style="victorian"
: Attribuez le style de maison que vous souhaitez sélectionner en dehors du script awk
pour qu'il soit plus facile à maintenirawk
: appeler awk-v s_style=$style
: L'option -v
Transmet une variable externe à awk. Vous devez le spécifier pour chaque variable que vous transmettez. Dans ce cas, il affecte la variable externe $style
À la variable awk s_style
.BEGIN{FS=OFS="\t"}
: Indique à awk que les séparateurs de champs dans la sortie doivent être des tabulations, pas des espaces par défaut.{$2==s_style {$2=""; sub("\t\t","\t"); print}}'
: Si le 2ème champ est le type de maison spécifié dans s_style
(dans ce cas, victorian
), supprimez-le et imprimez la ligne.Alternativement, vous pourriez faire:
#!/bin/bash
style="victorian"
awk -v s_style=$style 'BEGIN{FS=OFS="\t"}
$2==s_style {print $1, $3}'
mais cela suppose que vos fichiers d'entrée n'auront pas de champs supplémentaires séparés par des onglets à l'avenir.
En utilisant la variable OFS (Output Field Separator), vous pouvez éviter un codage en dur entre les lignes:
awk -F"\t" -v OFS="\t" '$2 == "victorian" { print $1,$3 }' file.in