#26 Le 14/08/2022, à 16:24
- Watael
Re : en BASH : extraire des lignes d'une catégorie souhaitée (sans awk)
une solution en bash :
#!/bin/bash
ficIn='livres.txt'
ficOut='fichier.out'
chemIn='/quelque/part'
chemOut='/aill/eurs'
## NE RIEN MODIFIER EN-DESSOUS ######
ficIn="$chemIn/$ficIn"
ficOut="$chemOut/$ficOut"
declare -i nbLivres
test -r "$ficIn" || { >&2 echo "le fichier \"$ficIn\" n'est pas accessible en lecture, ou n'existe pas."; exit 1;}
test -n "${cateUser:=$1}" || { >&2 echo "il faut indiquer une catégorie."; exit 2;}
while IFS=':' read nom prenom titre annee categ
do
if test "$cateUser" = "$categ"
then
concatLine[1]="${concatLine[1]:+"$concatLine1,"}$nom ($prenom) [$titre]"
concatLine[2]="${concatLine[2]:+"$concatLine2"$'\n'}$nom - $titre"
nbLivres+=1
fi
done < "$ficIn"
((nbLivres)) && printf '%s\n%s\n%Nb livres: d\n' "${concatLine[1]}" "${concatLine[2]}" $nbLivres >"$ficOut"
KISS!
Dernière modification par Watael (Le 14/08/2022, à 17:27)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#27 Le 14/08/2022, à 17:24
- MicP
Re : en BASH : extraire des lignes d'une catégorie souhaitée (sans awk)
Bonjour
Juste un petit i à mettre en majuscule dans :
ficIn="$chemin/$ficIn"
ce qui donnerait :
ficIn="$chemIn/$ficIn"
Dernière modification par MicP (Le 14/08/2022, à 17:31)
Hors ligne
#28 Le 14/08/2022, à 17:27
- Watael
Re : en BASH : extraire des lignes d'une catégorie souhaitée (sans awk)
corrigé. merci.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#29 Le 14/08/2022, à 17:32
- MicP
Re : en BASH : extraire des lignes d'une catégorie souhaitée (sans awk)
Il y a aussi :
nbLivres+=1
à remplacer par :
((nbLivres+=1))
EDIT : Ce n'était pas necessaire, voir les deux messages suivants.
Dernière modification par MicP (Le 15/08/2022, à 21:58)
Hors ligne
#30 Le 14/08/2022, à 17:42
- Watael
Re : en BASH : extraire des lignes d'une catégorie souhaitée (sans awk)
nbLivres a été déclaré en tant que nombre.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#31 Le 14/08/2022, à 18:01
- MicP
Re : en BASH : extraire des lignes d'une catégorie souhaitée (sans awk)
Cool,
Merci, je n'avais pas fait attention à cette importante déclaration :
declare -i nbLivres
=======
Voir :
man --pager='less -p "declare \["' bash
Dernière modification par MicP (Le 14/08/2022, à 18:07)
Hors ligne
#32 Le 15/08/2022, à 20:52
- LeoMajor
Re : en BASH : extraire des lignes d'une catégorie souhaitée (sans awk)
variante Tri Typé (string, integer, float, date, time, ...)
~$ cat ~/livres.csv
id:author:title:category:qty:price:delivery:schedule
22:Enid Mary Blyton:Oui-Oui et la Carte au trésor:ENFANTS:12:3.56:15/12/2022:"5:24"
13:Zitrou:Ducobu plouf:BD:113:8.56:15/12/2022:"12:30"
0:Enid Mary Blyton:Oui-Oui et Madame Ouistiti:ENFANTS:6:4.57:27/07/2022:"01:00"
1:Hubert Reeves:Poussières d'étoiles:ROMANS:12:23.45:01/02/2023:"4:56"
5:Enid Mary Blyton:Oui-Oui et la Poudre magique:ENFANTS:6:10.40:03/12/2022:"5:24"
10:Hubert Reeves:Patience dans l'azur:ROMANS:5:23.42:15/12/2022:"2:23"
7:Hergé:Le Temple du Soleil:BD:4:36.99:01/12/2022:"5:01"
30:Jean d'Ormesson:Un amour pour rien:ROMANS:10:22.32:04/02/2023:"3:02"
26:Edmond Rostand:Cyrano de Bergerac:X:0:15.52:28/10/2021:"0:00"
4:Hergé:Le Temple du Soleil:BD:1:10.40:01/11/2022:"6:00"
11:Enid Mary Blyton:Oui-Oui et la Gomme magique:ENFANTS:100:-1.05:24/12/2022:"4:23"
8:Roba:Boule et Bill tome7:BD:12:23.45:15/12/2022:"1:23"
2:Enid Mary Blyton:Oui-Oui et Noël:ENFANTS:100:-1.04:24/12/2022:"8:56"
22:Roba:Boule et Bill tome2:BD:5:11.78:15/12/2022:"7:23"
3:Hergé:Tintin au Tibet:BD:1:11.95:01/08/2022:"5:58"
22:Brunhoff:Babar et ce coquin:ENFANTS:5:5.56:15/12/2022:"4:10"
25:Jean d'Ormesson:Odeur du Temps:ROMANS:10:20:01/12/2022:"22:00"
12:Brunhoff:Babar à New York:ENFANTS:6:5.56:01/12/2022:"22:02"
42:André Franquin:Gaston Album20:BD:10:12.90:01/12/2022:"01:14"
14:Brunhoff:Babar et Noël:ENFANTS:100:-0.50:24/12/2022:"03:24"
15:Roba:Boule et Bill gold:BD:1:40.23:15/12/2022:"04:10"
16:Enid Mary Blyton:Oui-Oui et la voiture:ENFANTS:6:9.40:30/12/2021:"5:45"
20:Bernard Clavel:La Maison des autres:ROMANS:5:20.15:15/12/2022:"14:14"
9:Jean d'Ormesson:La Conversation:ROMANS:10:32.15:15/12/2022:"13:00"
21:Roba:Boule et Bill tome9:BD:5:20.45:15/12/2022:"8:10"
34:André Franquin:Gaston Album10:BD:6:11.90:15/12/2022:"9:08"
32:André Franquin:Gaston Album15:BD:10:11.90:15/12/2022:"06:45"
:~$ cat sortcollection.gbs
#!/usr/bin/env gbs3
Use "gb.util"
Public Struct AVar
ColumnKey As String
Order As Integer
A As Array
AT As Integer 'type Array
End Struct
Public Struct Order
Elem[4] As Struct AVar
End Struct
Private SK As New Order 'Sort Order by ColumnKey
Public Sub Main()
Dim t As Collection[]
System.Language = "fr_FR.utf8" 'useful for date[]
With SK.Elem[0]
.ColumnKey = "category"
.AT = 9
.Order = gb.Descent
End With
With SK.Elem[1]
.ColumnKey = "author"
.AT = 9
End With
With SK.Elem[2]
.ColumnKey = "qty"
.AT = 4
.Order = gb.Descent
End With
With SK.Elem[3]
.ColumnKey = "delivery"
.AT = 8
End With
t = SortByType(3, user.home &/ "livres.csv") ' 0->3
CheckHorizontal(t)
'Check(t)
SaveCsv("/tmp/foo.csv", t)
End
Public Function Csv2Ac(FileCsv As String) As Collection[]
Dim t As New Collection[], c As CsvFile
c = New CsvFile(FileCsv, ":")
'ok c = CsvFile.Open(FileCsv, ",")
While Not c.Eof
t.Add(c.Read())
Wend
Return t
End
Public Function SaveCsv(FileCsv As String, tb As Collection[])
Dim g As Collection
Dim c As CsvFile
c = CsvFile.Create(FileCsv, ",")
g = tb[0]
c.Fields = g.keys
For i As Integer = 0 To tb.Max
g = tb[i]
c.Write(g)
Next
c.Close()
print "SaveCsv " & FileCsv
End
Private Sub InitA(k As Integer, table As Collection[])
'Initialize & populate SK, k is skIndex
Dim tmp As Object, g As Collection
If k > 3 Then Error.Raise("InitA: 0,1,2,3 only")
If Not SK.Elem[k].AT Then Error.Raise("InitA: DataType ??")
'Dim k As Integer = 0
Select Case SK.Elem[k].AT
Case 1
tmp = New Boolean[]
Print "DIM 1"
Case 4
tmp = New Integer[]
Print "DIM 4"
Case 9
tmp = New String[]
Print "DIM 9"
Case 7
tmp = New Float[]
Print "DIM 7"
Case 8
tmp = New Date[]
Print "DIM 8"
' TypeDate= date,date+time,time
Default
tmp = New String[]
Print "DIM ELSE"
End Select
For i As Integer = 0 To table.max
g = table[i]
If g.Exist(SK.Elem[k].ColumnKey) Then
If SK.Elem[k].AT = 8 Then
tmp.Add(Val(g[SK.Elem[k].ColumnKey]))
Else
tmp.Add(g[SK.Elem[k].ColumnKey])
Endif
Endif
Next
If Not SK.Elem[k].Order Then SK.Elem[k].Order = gb.Ascent
SK.Elem[k].A = tmp
End
Public Function SortByType(Deep As Integer, FileCsv As String) As Collection[]
If Deep > 3 Then Error.Raise("Sort:Deep:0,1,2,3max")
Dim table As Collection[], k As Integer = 0, skIndex As Integer = 0
table = Csv2Ac(FileCsv)
Repeat
InitA(skIndex, table)
If skIndex = 0 Then
For i As Integer = 0 To (SK.Elem[k].A.Max - 1)
For j As Integer = i + 1 To SK.Elem[k].A.Max
If SK.Elem[k].Order = gb.Ascent Then
If SK.Elem[k].A[i] > SK.Elem[k].A[j] Then
Print "0++\t\tswap", SK.Elem[k].A[i], SK.Elem[k].A[j]
Swap SK.Elem[k].A[i], SK.Elem[k].A[j]
Swap table[i], table[j]
Endif
Endif
If SK.Elem[k].Order = gb.Descent Then
If SK.Elem[k].A[i] < SK.Elem[k].A[j] Then
Print "0--\t\tswap", SK.Elem[k].A[i], SK.Elem[k].A[j]
Swap SK.Elem[k].A[i], SK.Elem[k].A[j]
Swap table[i], table[j]
Endif
Endif
Next
Next
Endif
If skIndex = 1 Then
For i As Integer = 0 To (SK.Elem[k].A.Max - 1)
For j As Integer = i + 1 To SK.Elem[k].A.Max
If SK.Elem[k].A[i] = SK.Elem[k].A[j] Then
Debug "====", SK.Elem[k].A[i], SK.Elem[k].A[j]
If SK.Elem[k + 1].Order = gb.Ascent Then
If SK.Elem[k + 1].A[i] > SK.Elem[k + 1].A[j] Then
Print "1++\t\tswap", SK.Elem[k + 1].A[i], SK.Elem[k + 1].A[j]
Swap SK.Elem[k + 1].A[i], SK.Elem[k + 1].A[j]
Swap table[i], table[j]
Endif
Endif
If SK.Elem[k + 1].Order = gb.Descent Then
If SK.Elem[k + 1].A[i] < SK.Elem[k + 1].A[j] Then
Print "1--\t\tswap", SK.Elem[k + 1].A[i], SK.Elem[k + 1].A[j]
Swap SK.Elem[k + 1].A[i], SK.Elem[k + 1].A[j]
Swap table[i], table[j]
Endif
Endif
Endif
Next
Next
Endif
If skIndex = 2 Then
For i As Integer = 0 To (SK.Elem[k].A.Max - 1)
For j As Integer = i + 1 To SK.Elem[k].A.Max
If (SK.Elem[k].A[i] = SK.Elem[k].A[j]) And (SK.Elem[k + 1].A[i] = SK.Elem[k + 1].A[j]) Then
Debug "====", SK.Elem[k].A[i], SK.Elem[k].A[j], SK.Elem[k + 1].A[i], SK.Elem[k + 1].A[j]
If SK.Elem[k + 2].Order = gb.Ascent Then
If SK.Elem[k + 2].A[i] > SK.Elem[k + 2].A[j] Then
Print "2++\t\tswap", SK.Elem[k + 2].A[i], SK.Elem[k + 2].A[j]
Swap SK.Elem[k + 2].A[i], SK.Elem[k + 2].A[j]
Swap table[i], table[j]
Endif
Endif
If SK.Elem[k + 2].Order = gb.Descent Then
If SK.Elem[k + 2].A[i] < SK.Elem[k + 2].A[j] Then
Print "2--\t\tswap", SK.Elem[k + 2].A[i], SK.Elem[k + 2].A[j]
Swap SK.Elem[k + 2].A[i], SK.Elem[k + 2].A[j]
Swap table[i], table[j]
Endif
Endif
Endif
Next
Next
Endif
If skIndex = 3 Then
For i As Integer = 0 To (SK.Elem[k].A.Max - 1)
For j As Integer = i + 1 To SK.Elem[k].A.Max
If (SK.Elem[k].A[i] = SK.Elem[k].A[j]) And (SK.Elem[k + 1].A[i] = SK.Elem[k + 1].A[j]) And (SK.Elem[k + 2].A[i] = SK.Elem[k + 2].A[j]) Then
Debug "====", SK.Elem[k].A[i], SK.Elem[k].A[j], SK.Elem[k + 1].A[i], SK.Elem[k + 1].A[j], SK.Elem[k + 2].A[i], SK.Elem[k + 2].A[j]
If SK.Elem[k + 3].Order = gb.Ascent Then
If SK.Elem[k + 3].A[i] > SK.Elem[k + 3].A[j] Then
Print "3++\t\tswap", SK.Elem[k + 3].A[i], SK.Elem[k + 3].A[j]
Swap SK.Elem[k + 3].A[i], SK.Elem[k + 3].A[j]
Swap table[i], table[j]
Endif
Endif
If SK.Elem[k + 3].Order = gb.Descent Then
If SK.Elem[k + 3].A[i] < SK.Elem[k + 3].A[j] Then
Print "3--\t\tswap", SK.Elem[k + 3].A[i], SK.Elem[k + 3].A[j]
Swap SK.Elem[k + 3].A[i], SK.Elem[k + 3].A[j]
Swap table[i], table[j]
Endif
Endif
Endif
Next
Next
Endif
If skIndex = Deep Then Return table
Inc skIndex
Until skIndex > Deep
End
Public Sub Check(t As Collection[])
Print "\ncheck\n"
For i As Integer = 0 To t.max
For Each item As Variant In t[i]
Print t[i].key, ":", item
Next
Print
Next
End
Public Sub CheckHorizontal(t As Collection[])
Print "\ncheck\n"
For i As Integer = 0 To t.max
For Each item As Variant In t[i]
Print item & " | ";;
Next
Print
Next
End
exemple: Tri par catégorie (décroissant), auteur(croissant), quantité(décroissant), date de livraison(croissant)
:~$ gbs3 ~/sortcollection.gbs
DIM 9
0-- swap ENFANTS ROMANS
0-- swap ROMANS X
0-- swap BD ENFANTS
0-- swap ENFANTS ROMANS
0-- swap BD ENFANTS
0-- swap ENFANTS ROMANS
0-- swap BD ENFANTS
0-- swap ENFANTS ROMANS
0-- swap BD ENFANTS
0-- swap ENFANTS ROMANS
0-- swap BD ENFANTS
0-- swap ENFANTS ROMANS
0-- swap BD ENFANTS
0-- swap ENFANTS ROMANS
0-- swap BD ENFANTS
0-- swap BD ENFANTS
0-- swap BD ENFANTS
0-- swap BD ENFANTS
0-- swap BD ENFANTS
0-- swap BD ENFANTS
0-- swap BD ENFANTS
0-- swap BD ENFANTS
0-- swap BD ENFANTS
DIM 9
1++ swap Hubert Reeves Bernard Clavel
1++ swap Jean d'Ormesson Hubert Reeves
1++ swap Jean d'Ormesson Hubert Reeves
1++ swap Enid Mary Blyton Brunhoff
1++ swap Enid Mary Blyton Brunhoff
1++ swap Enid Mary Blyton Brunhoff
1++ swap Zitrou Roba
1++ swap Roba André Franquin
1++ swap Zitrou Roba
1++ swap Roba Hergé
1++ swap Hergé André Franquin
1++ swap Zitrou Roba
1++ swap Roba Hergé
1++ swap Hergé André Franquin
1++ swap Zitrou Roba
1++ swap Roba Hergé
1++ swap Zitrou Roba
1++ swap Roba Hergé
1++ swap Zitrou Roba
1++ swap Roba Hergé
1++ swap Zitrou Roba
1++ swap Zitrou Roba
1++ swap Zitrou Roba
1++ swap Zitrou Roba
DIM 4
2-- swap 5 6
2-- swap 6 100
2-- swap 5 6
2-- swap 6 100
2-- swap 6 100
2-- swap 6 12
2-- swap 6 10
2-- swap 1 4
2-- swap 1 5
2-- swap 5 12
2-- swap 1 5
2-- swap 1 5
DIM 8
3++ swap 04/02/2023 00:00:00 15/12/2022 00:00:00
3++ swap 01/11/2022 00:00:00 01/08/2022 00:00:00
check
26 | Edmond Rostand | Cyrano de Bergerac | X | 0 | 15.52 | 28/10/2021 | 0:00 |
20 | Bernard Clavel | La Maison des autres | ROMANS | 5 | 20.15 | 15/12/2022 | 14:14 |
1 | Hubert Reeves | Poussières d'étoiles | ROMANS | 12 | 23.45 | 01/02/2023 | 4:56 |
10 | Hubert Reeves | Patience dans l'azur | ROMANS | 5 | 23.42 | 15/12/2022 | 2:23 |
25 | Jean d'Ormesson | Odeur du Temps | ROMANS | 10 | 20 | 01/12/2022 | 22:00 |
9 | Jean d'Ormesson | La Conversation | ROMANS | 10 | 32.15 | 15/12/2022 | 13:00 |
30 | Jean d'Ormesson | Un amour pour rien | ROMANS | 10 | 22.32 | 04/02/2023 | 3:02 |
14 | Brunhoff | Babar et Noël | ENFANTS | 100 | -0.50 | 24/12/2022 | 03:24 |
12 | Brunhoff | Babar à New York | ENFANTS | 6 | 5.56 | 01/12/2022 | 22:02 |
22 | Brunhoff | Babar et ce coquin | ENFANTS | 5 | 5.56 | 15/12/2022 | 4:10 |
2 | Enid Mary Blyton | Oui-Oui et Noël | ENFANTS | 100 | -1.04 | 24/12/2022 | 8:56 |
11 | Enid Mary Blyton | Oui-Oui et la Gomme magique | ENFANTS | 100 | -1.05 | 24/12/2022 | 4:23 |
22 | Enid Mary Blyton | Oui-Oui et la Carte au trésor | ENFANTS | 12 | 3.56 | 15/12/2022 | 5:24 |
16 | Enid Mary Blyton | Oui-Oui et la voiture | ENFANTS | 6 | 9.40 | 30/12/2021 | 5:45 |
0 | Enid Mary Blyton | Oui-Oui et Madame Ouistiti | ENFANTS | 6 | 4.57 | 27/07/2022 | 01:00 |
5 | Enid Mary Blyton | Oui-Oui et la Poudre magique | ENFANTS | 6 | 10.40 | 03/12/2022 | 5:24 |
42 | André Franquin | Gaston Album20 | BD | 10 | 12.90 | 01/12/2022 | 01:14 |
32 | André Franquin | Gaston Album15 | BD | 10 | 11.90 | 15/12/2022 | 06:45 |
34 | André Franquin | Gaston Album10 | BD | 6 | 11.90 | 15/12/2022 | 9:08 |
7 | Hergé | Le Temple du Soleil | BD | 4 | 36.99 | 01/12/2022 | 5:01 |
3 | Hergé | Tintin au Tibet | BD | 1 | 11.95 | 01/08/2022 | 5:58 |
4 | Hergé | Le Temple du Soleil | BD | 1 | 10.40 | 01/11/2022 | 6:00 |
8 | Roba | Boule et Bill tome7 | BD | 12 | 23.45 | 15/12/2022 | 1:23 |
22 | Roba | Boule et Bill tome2 | BD | 5 | 11.78 | 15/12/2022 | 7:23 |
21 | Roba | Boule et Bill tome9 | BD | 5 | 20.45 | 15/12/2022 | 8:10 |
15 | Roba | Boule et Bill gold | BD | 1 | 40.23 | 15/12/2022 | 04:10 |
13 | Zitrou | Ducobu plouf | BD | 113 | 8.56 | 15/12/2022 | 12:30 |
SaveCsv /tmp/foo.csv
:~$ cat /tmp/foo.csv
id,author,title,category,qty,price,delivery,schedule
26,"Edmond Rostand","Cyrano de Bergerac",X,0,15.52,28/10/2021,0:00
20,"Bernard Clavel","La Maison des autres",ROMANS,5,20.15,15/12/2022,14:14
1,"Hubert Reeves","Poussières d'étoiles",ROMANS,12,23.45,01/02/2023,4:56
10,"Hubert Reeves","Patience dans l'azur",ROMANS,5,23.42,15/12/2022,2:23
25,"Jean d'Ormesson","Odeur du Temps",ROMANS,10,20,01/12/2022,22:00
9,"Jean d'Ormesson","La Conversation",ROMANS,10,32.15,15/12/2022,13:00
30,"Jean d'Ormesson","Un amour pour rien",ROMANS,10,22.32,04/02/2023,3:02
14,Brunhoff,"Babar et Noël",ENFANTS,100,-0.50,24/12/2022,03:24
12,Brunhoff,"Babar à New York",ENFANTS,6,5.56,01/12/2022,22:02
22,Brunhoff,"Babar et ce coquin",ENFANTS,5,5.56,15/12/2022,4:10
2,"Enid Mary Blyton","Oui-Oui et Noël",ENFANTS,100,-1.04,24/12/2022,8:56
11,"Enid Mary Blyton","Oui-Oui et la Gomme magique",ENFANTS,100,-1.05,24/12/2022,4:23
22,"Enid Mary Blyton","Oui-Oui et la Carte au trésor",ENFANTS,12,3.56,15/12/2022,5:24
16,"Enid Mary Blyton","Oui-Oui et la voiture",ENFANTS,6,9.40,30/12/2021,5:45
0,"Enid Mary Blyton","Oui-Oui et Madame Ouistiti",ENFANTS,6,4.57,27/07/2022,01:00
5,"Enid Mary Blyton","Oui-Oui et la Poudre magique",ENFANTS,6,10.40,03/12/2022,5:24
42,"André Franquin","Gaston Album20",BD,10,12.90,01/12/2022,01:14
32,"André Franquin","Gaston Album15",BD,10,11.90,15/12/2022,06:45
34,"André Franquin","Gaston Album10",BD,6,11.90,15/12/2022,9:08
7,Hergé,"Le Temple du Soleil",BD,4,36.99,01/12/2022,5:01
3,Hergé,"Tintin au Tibet",BD,1,11.95,01/08/2022,5:58
4,Hergé,"Le Temple du Soleil",BD,1,10.40,01/11/2022,6:00
8,Roba,"Boule et Bill tome7",BD,12,23.45,15/12/2022,1:23
22,Roba,"Boule et Bill tome2",BD,5,11.78,15/12/2022,7:23
21,Roba,"Boule et Bill tome9",BD,5,20.45,15/12/2022,8:10
15,Roba,"Boule et Bill gold",BD,1,40.23,15/12/2022,04:10
13,Zitrou,"Ducobu plouf",BD,113,8.56,15/12/2022,12:30
libreoffice
localc /tmp/foo.csv
Hors ligne
#33 Le 15/08/2022, à 23:03
- Watael
Re : en BASH : extraire des lignes d'une catégorie souhaitée (sans awk)
hmmm. `toujours pas en bash.
et encore quelques fois plus d'une vingtaine de lignes.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne