Compter les nombres spécifiques d’une colonne à partir d’un fichier d’entrée linux

J’essayais de lire un fichier et de compter un nombre spécifique à un endroit spécifique et d’indiquer le nombre de fois qu’il apparaît, par exemple: 1er champ: numéros, 2ème nom de domaine, 3ème champ, groupe auquel ils appartiennent, 4ème et 5ème pas important .

1:audi:2:1990:5 2:bmw:2:1987:4 3:bugatti:3:1988:19 4.buick:4:2000:12 5:dodge:2:1999:4 6:ferrari:2:2000:4 

En tant que sortie, je veux effectuer une recherche par colonne 3 et regrouper les 2 (par nom de marque) et compter combien d’entre eux j’ai. La sortie que je recherche devrait ressembler à ceci:

 1:audi:2:1990:5 2:bmw:2:1987:4 5:dodge:2:1999:4 6:ferrari:2:2000:4 

4 -> montrant combien de lignes il y a. J’ai essayé de prendre cette approche mais je n’arrive pas à comprendre:

 file="cars.txt"; sort -t ":" -k3 $file #sorting by the 3rd field grep -c '2' cars.txt # this counts all the 2's in the file including number 2. 

J’espère que tu comprends. et merci d’avance.

Je ne suis pas sûr de ce que vous entendez par «regrouper par nom de marque», mais vous obtiendrez le résultat que vous décrivez.

 awk -F':' '$3 == 2' Input.txt 

Si vous voulez un nombre de lignes, vous pouvez le convertir en wc -l .

 awk -F':' '$3 == 2' Input.txt | wc -l 

Je suppose que la ligne 4 est 4: buick et non 4.buick. Alors je suggère ceci

 $ awk 'BEGIN{FS=":"} $3~2{total++;print} END{print "TOTAL --- "total}' Input.txt 

Solution simple bash :

 #!/bin/bash while IFS=":" read -ra line; do if (( ${line[2]} == 2 )); then IFS=":" && echo "${line[*]}" (( count++ )) fi done < file echo "Count = $count" 

Sortie:

 1:audi:2:1990:5 2:bmw:2:1987:4 5:dodge:2:1999:4 6:ferrari:2:2000:4 Count = 4