web-dev-qa-db-fra.com

Utilisation d'AWK pour sélectionner des lignes avec une valeur spécifique dans une colonne spécifique

J'ai un gros fichier csv, qui ressemble à ceci:

1,2,3,4,5,6,-99
1,2,3,4,5,6,-99
1,2,3,4,5,6,-99
1,2,3,4,5,6,25178
1,2,3,4,5,6,27986
1,2,3,4,5,6,-99

Je veux sélectionner uniquement les lignes dans lesquelles la 7e colonne est égale à -99, donc ma sortie sera:

1,2,3,4,5,6,-99
1,2,3,4,5,6,-99
1,2,3,4,5,6,-99
1,2,3,4,5,6,-99

J'ai essayé ce qui suit:

awk -F, '$7 == -99' input.txt > output.txt
awk -F, '{ if ($7 == -99) print $1,$2,$3,$4,$5,$6,$7 }' input.txt > output.txt

Mais les deux ont renvoyé un output.txt vide. Quelqu'un peut-il me dire ce que je fais mal? Merci.

6
Isabela Martins

Le fichier sur lequel vous exécutez le script a des fins de ligne DOS. Il se peut qu'il ait été créé sur une machine Windows.

Utilisation dos2unix pour le convertir en fichier texte Unix.

Vous pouvez également l'exécuter via tr:

tr -d '\r' <input.txt >input-unix.txt

Utilisez ensuite input-unix.txt avec votre code awk par ailleurs correct.


Pour modifier le code awk au lieu du fichier d'entrée:

awk -F, '$7 == "-99\r"' input.txt >output.txt

Cela prend en compte le retour chariot en fin de ligne.

Ou,

awk -F, '$7 + 0 == -99' input.txt >output.txt

Cela force la 7e colonne à être interprétée comme un nombre, ce qui "supprime" le retour chariot.

De même,

awk -F, 'int($7) == -99' input.txt >output.txt

supprimerait également le \r.

7
Kusalananda
awk -F, '{if($7==-99)print $0}'

fera cela...

1
tonioc

Une légère modification de la réponse de @ tonioc

awk '{if($7 == -99){print}}' file > outfile
0

un peu tard pour la fête .. mais ça devrait le faire

awk -F, '$7 ~ /-99/' input.txt > output.txt

votre original fonctionnerait également si vous ajoutiez des guillemets, comme ça

awk -F, '$7 == "-99"' input.txt > output.txt

L'action par défaut lors de l'utilisation d'une correspondance de motif consiste à imprimer, donc {print} ne sera pas nécessaire

0
Wayne
awk -F',' '$7 ~ /-99/ {print $0}' filename.csv > result.csv
  1. Veuillez noter que ',' définit votre séparateur comme une virgule.

  2. $ définit la colonne. donc, $7 définit le numéro de colonne auquel vous souhaitez attribuer une valeur spéciale. ici 7.

  3. ~ /-99/ recherche -99. vous pourriez mettre tout ce dont vous avez besoin.

  4. $0 représente TOUTES les colonnes du fichier. Vous pouvez simplement écrire $1","$2","......si vous ne souhaitez pas imprimer uniquement des colonnes spécifiques. (ou $1$2... si vous n'avez pas besoin de virgule comme séparateur pour vos résultats)

  5. > result.csv enregistre la sortie au lieu de l'imprimer dans le terminal dans result.scv fichier.

0
Tara