web-dev-qa-db-fra.com

Supprimer des colonnes d'un fichier avec awk ou de la ligne de commande sur linux

Comment puis-je supprimer certaines colonnes d'un fichier de champs séparés par des tabulations avec awk?

c1 c2 c3 ..... c60

Par exemple, supprimez les colonnes entre 3 et 29.

21
user951487

Voici à quoi sert la commande cut:

cut -f1,2,30- inputfile

La valeur par défaut est tab. Vous pouvez changer cela avec le -d commutateur.

42
Stephen Darlington

Vous pouvez parcourir toutes les colonnes et filtrer celles que vous ne voulez pas:

awk '{for (i=1; i<=NF; i++) if (i<3 || i>29) printf $i " "; print""}' input.txt

NF vous donne le nombre total de champs dans un enregistrement.
Pour chaque colonne qui remplit la condition, nous imprimons la colonne suivie d'un espace " ".


EDIT: mis à jour après une remarque de johnny:

awk -F 'FS' 'BEGIN{FS="\t"}{for (i=1; i<=NF-1; i++) if(i<3 || i>5) {printf $i FS};{print $NF}}' input.txt

ceci est amélioré de 2 manières:

  • conserve les séparateurs d'origine
  • n'ajoute pas de séparateur à la fin
11
oliver
awk '{for(z=3;z<=15;z++)$z="";$0=$0;$1=$1}1'

Contribution

c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 c13 c14 c15 c16 c17 c18 c19 c20 c21

Production

c1 c2 c16 c17 c18 c19 c20 c21
1
Steven Penny

Solution "d'épissage" Perl qui n'ajoute pas d'espace blanc de début ou de fin:

Perl -lane 'splice @F,3,27; print join " ",@F' file

Produit une sortie:

c1 c2 c30 c31
0
Chris Koknat