Score:-1

จะกรองแถวในไฟล์ csv ด้วย bash ในสองเงื่อนไขได้อย่างไร

ธง br

ฉันกำลังทำโปรเจ็กต์ที่ต้องแยกวิเคราะห์ไฟล์ csv (ชุดข้อมูลผู้ป่วยตับในอินเดีย) และฉันกำลังพยายามเปลี่ยนตำแหน่งของหนึ่งคอลัมน์ คอลัมน์ที่สองจากสุดท้ายต้องเป็นคอลัมน์สุดท้าย ฉันกำลังทำตามแนวทางเหล่านี้ แต่ไม่รู้ว่าเป็นแนวทางที่ถูกต้องหรือไม่:

ในขณะที่ IFS="," อ่าน -r col1 col2 col9 col8 col

ทำ

echo "$col1, $col2, $col9, $col8"

เสร็จสิ้น < <(cut -d "," --fields=1,2,9,8 csvfile)

นอกจากนี้ ฉันต้องแยกระหว่าง "ชาย" และ "หญิง" (col2) และแสดงค่าเหล่านั้นโดยที่ col9 = 3 ผลลัพธ์ที่ต้องการคือ:

ผู้หญิง
38,หญิง,3, 5.6
38,หญิง,3, 5.6
32,หญิง,3, 6

และอื่น ๆ

ผู้ชาย
72,ชาย,3, 7.4
60,ชาย,3, 6.3
33,ชาย,3, 5.4

และอื่น ๆ

ฉันจะทำอย่างนั้นโดยไม่ใช้ grep หรือ akw ได้อย่างไร

muru avatar
us flag
ทำไมคุณใช้ grep หรือ awk ไม่ได้
tucomax avatar
br flag
กฎของโครงการ ฉันไม่สามารถเปลี่ยนสิ่งนั้นได้
muru avatar
us flag
กฎโครงการใดที่อนุญาตให้ 'ตัด' แต่ไม่ใช่ 'awk'
Score:0
ธง cn

ฉันเห็นด้วยกับ Muru ที่ไม่ยอมให้เครื่องมือที่เหมาะสมที่สุดไม่เหมาะสม แต่อาจมีจุดประสงค์ ฉันไม่คิดว่ามันเป็นไปได้ที่จะทำสิ่งนี้ในลูปเดียว อย่างน้อยก็ไม่ต้องจัดเรียงไฟล์ก่อนหรือทิ้งส่วนหัว ด้วยอาร์เรย์ที่เชื่อมโยง คุณสามารถจำลอง "จัดกลุ่มตาม" โดยที่คีย์กลายเป็นเพศหญิงหรือชาย และฟิลด์ของคีย์นั้นจะถูก "เรียงลำดับ" เป็นค่า ในครั้งแรก ห่วง _ ใช้เพื่อข้ามช่องและช่องที่สองสำหรับ ห่วง วนซ้ำผ่านคีย์และจัดรูปแบบเอาต์พุต

#!/bin/bash

ประกาศ -A =()
ประกาศ -A B=([ชาย]=ชาย [หญิง]=หญิง)

ในขณะที่ IFS= อ่าน -r a b _ _ _ _ _ c d _ ; ทำ
    [[ $d = 3 ]] && \
        A[$b]+=" $a $b $d $c"
เสร็จแล้ว < file.csv

สำหรับ e ใน ${!A[@]}; ทำ
    พิมพ์f %s%s\n "$nl" ${B[$e]}
    printf '%s, %s, %s, %s\n' ${A[$e]}; nl=$'\n'
เสร็จแล้ว
tucomax avatar
br flag
คำตอบนี้มีคุณสมบัติทั้งหมดที่ฉันกำลังมองหาขอบคุณฉันได้เห็นข้อผิดพลาดของฉัน
Score:0
ธง cn

ฉันจะติดคำสั่ง IF รอบ echo และต่อท้ายไฟล์แยกต่างหาก

ก่อนที่ลูปการอ่านจะเริ่มขึ้น

# ลบไฟล์ CSV อย่างเงียบ ๆ
rm col2eq8.csv 2> /dev/null
rm col2noteq8.csv 2> /dev/null

ภายในวงการอ่านของคุณ:

# ถ้า $col2 เท่ากับ 8
ถ้า [[ "$col2" -eq 8 ]]
แล้ว
  # จากนั้นเรียงลำดับคอลัมน์ใหม่และต่อท้ายไฟล์ col2eq8.csv
  echo "$col1, $col2, $col9, $col8" >> col2eq8.csv
อื่น
  # มิฉะนั้นเรียงลำดับคอลัมน์ใหม่และต่อท้าย col2noteq8.csv
  echo "$col1, $col2, $col9, $col8" >> col2noteq8.csv
ไฟ

เปลี่ยนคำสั่ง echo สองคำสั่งเพื่อรับเฉพาะฟิลด์ที่คุณต้องการตามลำดับที่คุณต้องการ

หากคุณต้องการแยกตามคอลัมน์ ให้เปลี่ยน '$col2 -eq 8' เป็นเงื่อนไขที่คุณต้องการ

สำหรับการปรับแต่ง CSV แบบ bash-only อื่นๆ โปรดดู การแยกวิเคราะห์ Bash CSV.

tucomax avatar
br flag
ขอบคุณสำหรับคำตอบ. สิ่งที่ฉันทำผิดพลาด แทนที่จะเป็น col8 เป็น col2 นอกจากนี้ทุกแถวในคอลัมน์นั้นเป็นเพศชายหรือเพศหญิงและฉันต้องแยกออกและนำเพศชายทั้งหมดมารวมกันและเหมือนกันกับเพศหญิง สุดท้ายฉันต้องแสดงเฉพาะแถวเท่ากับ 3 ของ col9
cn flag
คุณสามารถเปลี่ยนแปลงคำสั่ง IF ของคุณได้ เช่น col2=ชาย และ (&&) col9=3: ถ้า [[ "$col2" == "ชาย" && "$col9" -eq 3 ]]
tucomax avatar
br flag
นี่เป็นคำตอบที่ดีเช่นกัน มันช่วยฉันได้มากในการจัดการกับงาน

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา