Score:0

แก้ไขคอลัมน์เฉพาะตามคอลัมน์อื่นโดยใช้ awk และ gsub

ธง bt

ฉันมีไฟล์ (file1) ที่มีแถวและคอลัมน์หลายล้านแถว ตัวอย่างของข้อมูลได้แก่:

"col1","col2","col3","col4","col5","col6"
"AAA",0,5,10,"BGB",50
"บีบีบี",4,7,10,"บีเอฟดี",76
"AAA",15,0,0,"BGB",20
"AAA",10,13,10,"DDD",23

ฉันต้องการค้นหาทุกบรรทัดที่มี AAA ใน col1 แล้วรับแถวทั้งหมดที่มี BGB ใน col5 และสุดท้าย ลด 50% ของทุกค่าใน col2, col3, col4 และ col6 (ไม่ต้องสนใจว่าค่าในเซลล์เป็น 0 หรือว่างเปล่า) และพิมพ์ทุกบรรทัดของไฟล์. ดังนั้นผลลัพธ์ของฉันจะมีลักษณะดังนี้:

"col1","col2","col3","col4","col5","col6"
"AAA",0,2.5,5,"BGB",25
"บีบีบี",4,7,10,"บีเอฟดี",76
"AAA",7.5,0,0,"BGB",10
"AAA",10,13,10,"DDD",23

ฉันได้ลองทำสิ่งต่อไปนี้แล้ว แต่ไม่สามารถใช้งานได้ (และไม่สามารถหาวิธีใช้หลายคอลัมน์ใน gsub)

ไฟล์ grep AAA1 | awk -F "," '$5~/BGB/ {gsub($6,\substr($6,1,length($6)-1)*0.50\, $6}1'
ChanganAuto avatar
us flag
สิ่งนี้เกี่ยวข้องกับ Ubuntu หรือไม่
NotTheDr01ds avatar
vn flag
หรือ Windows Subsystem สำหรับ Linux (ตามแท็ก)?
Score:1
ธง cn

awk สามารถจับคู่รูปแบบเหมือนที่ grep ทำ คุณจึงแทบไม่ต้องใช้ grep และ awk ในไปป์ไลน์เลย

คุณสามารถทำได้

 อึดอัด '
    เริ่มต้น {FS = OFS = ","}
    $1 ~ /AAA/ && $5 ~ /BGB/ {
        ถ้า ($2) $2 = $2 / 2
        ถ้า ($3) $3 = $3 / 2
        ถ้า ($4) $4 = $4 / 2
        ถ้า ($6) $6 = $6 / 2
    }
    1
' ไฟล์

หรือหากต้องการให้คอลัมน์ลดไดนามิกมากขึ้น

awk -v "คอลัมน์=2,3,4,6" '
    เริ่ม {
        FS = OFS = ","
        n = แยก (คอลัมน์, a, /,/)
        สำหรับ (i=1; i<=n; i++) cols[a[i]]=1
    }
    $1 ~ /AAA/ && $5 ~ /BGB/ {
        สำหรับ (c ใน cols) ถ้า ($c) $c = $c / 2
    }
    1
' ไฟล์

โพสต์คำตอบ

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