Puncte:-1

Cum se filtrează rândurile într-un fișier csv cu bash bazat pe două condiții?

drapel br

Fac un proiect în care trebuie să analizez un fișier csv (set de date pentru pacientul cu ficat indian) și încerc să schimb poziția unei coloane. Penultima trebuie să fie ultima coloană. Urmăresc aceste abordări, dar nu știu dacă este cea potrivită:

în timp ce IFS="," citește -r col1 col2 col9 col8 col

do

echo „$col1, $col2, $col9, $col8”

terminat < <(cut -d "," --fields=1,2,9,8 csvfile)

De asemenea, trebuie să separ între „Bărbat” și „femeie” (col2) și să arăt doar acele valori în care col9 = 3. Rezultatul dorinței este:

femei
38, Femeie, 3, 5,6
38, Femeie, 3, 5,6
32, Femeie, 3, 6

și așa mai departe

Bărbați
72, Bărbat, 3, 7,4
60, Bărbat, 3, 6,3
33, Bărbat, 3, 5,4

și așa mai departe

Cum pot face asta fără să folosesc grep sau akw?

muru avatar
drapel us
De ce nu poți folosi grep sau awk?
tucomax avatar
drapel br
Regulile proiectului. Nu pot schimba asta.
muru avatar
drapel us
Ce reguli de proiect permit `cut`, dar nu `awk`?
Puncte:0
drapel cn

Aș lipi o declarație IF în jurul ecoului și aș adăuga fișiere separate.

Înainte de a începe bucla de citire

# ștergeți în liniște fișierele CSV
rm col2eq8.csv 2> /dev/null
rm col2noteq8.csv 2> /dev/null

În bucla de citire:

# dacă $col2 este egal cu 8
dacă [[ "$col2" -eq 8 ]]
atunci
  # apoi reordonați coloanele și adăugați la fișierul col2eq8.csv
  echo „$col1, $col2, $col9, $col8” >> col2eq8.csv
altfel
  # else reordonează coloanele și adaugă la col2noteq8.csv
  echo „$col1, $col2, $col9, $col8” >> col2noteq8.csv
fi

Schimbați cele două comenzi eco pentru a obține doar câmpurile dorite în ordinea dorită.

Dacă trebuie să separați pe baza coloanelor, schimbați „$col2 -eq 8” pentru a fi orice condiție doriți.

Pentru alte manipulări CSV numai pentru bash, consultați Analiza CSV Bash.

tucomax avatar
drapel br
Multumesc pentru raspuns. Chestia este că am făcut o greșeală. În loc de col8 este col2. De asemenea, fiecare rând din acea coloană este Masculin sau Femeie și trebuie să-i separ și să pun toți bărbații împreună și la fel cu Femele. În cele din urmă, trebuie să arăt doar rânduri egale cu 3 din col9.
drapel cn
Vă puteți modifica declarațiile IF, de ex. col2=masculin și (&&) col9=3: dacă [[ "$col2" == "Bărbat" && "$col9" -eq 3 ]]
tucomax avatar
drapel br
Acesta este și un răspuns grozav. Mă ajută foarte mult să fac față sarcinii.
Puncte:0
drapel cn

Sunt de acord cu Muru că nu permite instrumentele cele mai potrivite nu este optim, probabil că are scopul ei, totuși. Nu cred că este posibil să faceți acest lucru într-o singură buclă, cel puțin nu fără a sorta mai întâi fișierul sau a arunca antetul. Cu o matrice asociativă, este posibil să simulați „grupare după” unde cheia devine Femeie sau Masculin, iar câmpurile sale sunt „serializate” ca valoare. In primul buclă _ este folosit pentru a sări peste câmpuri, iar al doilea pentru buclă iterează prin taste și formatează rezultatul.

#!/bin/bash

declara -A A=()
declara -A B=([Bărbați]=Bărbați [Femei]=Femei)

în timp ce IFS=, citește -r a b _ _ _ _ _ c d _ ; do
    [[ $d = 3 ]] && \
        A[$b]+=" $a $b $d $c"
terminat < file.csv

pentru e în ${!A[@]}; do
    printf %s%s\n „$nl” ${B[$e]}
    printf '%s, %s, %s, %s\n' ${A[$e]}; nl=$'\n'
Terminat
tucomax avatar
drapel br
Acest răspuns are toate caracteristicile pe care le căutam.Multumesc, am vazut greselile mele.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.