web-dev-qa-db-fra.com

awk one liner sélectionner uniquement les lignes en fonction de la valeur d'une colonne

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.
16
Dnaiel
awk -F"\t" '$2 == "victorian" { print $1"\t"$3 }' file.in
32
Kevin

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 à maintenir
  • awk: 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.

8
sampson-chen

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
2
mlegge