Điểm:-1

Làm cách nào để lọc các hàng trong tệp csv bằng bash dựa trên hai điều kiện?

lá cờ br

Tôi đang thực hiện một dự án mà tôi phải phân tích tệp csv (bộ dữ liệu bệnh nhân gan Ấn Độ) và tôi đang cố thay đổi vị trí của một cột. Thứ hai đến cuối cùng phải là cột cuối cùng. Tôi đang làm theo cách tiếp cận này nhưng tôi không biết liệu nó có đúng không:

trong khi IFS="," đọc -r col1 col2 col9 col8 col

làm

tiếng vang "$col1, $col2, $col9, $col8"

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

Ngoài ra, tôi cần phân tách giữa "Nam" và "nữ" (col2) và chỉ hiển thị các giá trị đó trong đó col9 = 3. Đầu ra mong muốn là:

Phụ nữ
38,Nữ,3, 5,6
38,Nữ,3, 5,6
32,Nữ,3, 6

và như thế

đàn ông
72,Nam,3, 7,4
60,Nam,3, 6.3
33,Nam,3, 5.4

và như thế

Làm thế nào tôi có thể làm điều đó mà không cần sử dụng grep hoặc akw?

muru avatar
lá cờ us
Tại sao bạn không thể sử dụng grep hoặc awk?
tucomax avatar
lá cờ br
Nội quy dự án. Tôi không thể thay đổi điều đó.
muru avatar
lá cờ us
Quy tắc dự án nào cho phép `cut` nhưng không cho phép `awk`?
Điểm:0
lá cờ cn

Tôi sẽ dán một câu lệnh IF xung quanh tiếng vang và nối vào các tệp riêng biệt.

Trước khi vòng lặp đọc bắt đầu

# lặng lẽ xóa tệp CSV
rm col2eq8.csv 2> /dev/null
rm col2noteq8.csv 2> /dev/null

Bên trong vòng đọc của bạn:

# nếu $col2 bằng 8
nếu [[ "$col2" -eq 8 ]]
sau đó
  # sau đó sắp xếp lại các cột và thêm vào tệp col2eq8.csv
  tiếng vang "$col1, $col2, $col9, $col8" >> col2eq8.csv
khác
  # khác sắp xếp lại các cột và thêm vào col2noteq8.csv
  echo "$col1, $col2, $col9, $col8" >> col2noteq8.csv
fi

Thay đổi hai lệnh echo để chỉ nhận các trường bạn muốn theo thứ tự bạn muốn.

Nếu bạn cần phân tách dựa trên các cột, hãy thay đổi '$col2 -eq 8' thành bất kỳ điều kiện nào bạn muốn.

Đối với các thao tác CSV chỉ bash khác, hãy xem Phân tích cú pháp Bash CSV.

tucomax avatar
lá cờ br
Cảm ơn bạn vì câu trả lời. Vấn đề là tôi đã phạm sai lầm. Thay vì col8 là col2. Ngoài ra, mỗi hàng trong cột đó là Nam hoặc Nữ và tôi phải tách chúng ra và đặt tất cả Nam với nhau và tương tự với Nữ. Cuối cùng, tôi phải chỉ hiển thị các hàng bằng 3 của col9.
lá cờ cn
Bạn có thể thay đổi câu lệnh IF của mình, ví dụ: col2=nam và (&&) col9=3: if [[ "$col2" == "Nam" && "$col9" -eq 3 ]]
tucomax avatar
lá cờ br
Đây cũng là câu trả lời tuyệt vời. Nó giúp tôi rất nhiều để giải quyết công việc.
Điểm:0
lá cờ cn

Tôi đồng ý với việc Muru không cho phép các công cụ phù hợp nhất không phải là tối ưu, mặc dù có thể có mục đích của nó. Tôi không nghĩ rằng có thể thực hiện việc này trong một vòng lặp, ít nhất là không sắp xếp tệp trước hoặc loại bỏ tiêu đề. Với một mảng kết hợp, có thể mô phỏng "nhóm theo" trong đó khóa trở thành Nữ hoặc Nam và các trường của nó được "đánh số thứ tự" thành giá trị. Trước hết vòng _ được sử dụng để bỏ qua các trường và trường thứ hai dành cho vòng lặp qua các khóa và định dạng đầu ra.

#!/bin/bash

khai báo -A A=()
khai báo -A B=([Nam]=Nam [Nữ]=Nữ)

trong khi IFS=, đọc -r a b _ _ _ _ _ c d _ ; làm
    [[ $d = 3 ]] && \
        A[$b]+=" $a $b $d $c"
xong < file.csv

cho e trong ${!A[@]}; làm
    printf %s%s\n "$nl" ${B[$e]}
    printf '%s, %s, %s, %s\n' ${A[$e]}; nl=$'\n'
xong
tucomax avatar
lá cờ br
Câu trả lời này có tất cả các tính năng tôi đang tìm kiếm.Cảm ơn bạn tôi đã thấy những sai lầm của tôi.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.