แยกข้อมูลจากไฟล์และวางในไฟล์ที่แตกต่างกันตามค่าของคอลัมน์หนึ่งคอลัมน์


14

เราจะสร้างไฟล์ csv โดยมีค่าต่ำกว่า

yp1234,577,1,3
yp5678,577,3,5
yp9012,132,8,9

ฉันต้องการแยกข้อมูลและสร้างไฟล์ตามคอลัมน์ที่สอง หากเป็น 577 จะต้องแยกทั้งบรรทัดและวางในไฟล์แยกต่างหาก ฉันหมายถึงฉันต้องการไฟล์ที่มีบรรทัดที่มีคอลัมน์ที่สองเป็น 577 อยู่คนเดียวและอีกไฟล์ที่มีคอลัมน์ที่สองเป็น 132 คนเดียว

ฉันลองใช้ IF แต่ไม่ได้ผล


5
การโพสต์รหัสที่ใช้ไม่ได้จริง ๆ แล้วเป็นความคิดที่ดีเสมอ
goldilocks

คำตอบ:


27

การใช้awk:

awk -F, '{ print > $2 ".csv" }' file.csv

สิ่งนี้จะสร้างสองไฟล์577.csvและ132.csvในไดเรกทอรีปัจจุบันของคุณ

คำสั่งดังกล่าวจะถือว่าคุณสามารถมี132หรือ577เป็นฟิลด์ที่สองเท่านั้น file.csvมันจะสร้างชื่อไฟล์หนึ่งสำหรับแต่ละของค่าที่พบในสนามที่สองของทั้ง

หากมีค่าอื่นนอกเหนือจากค่าสองค่าที่คุณสนใจและคุณต้องการละเว้นบรรทัดเหล่านั้นให้ทำดังนี้แทน:

awk -F, '$2 == "577" || $2 == "132" { print > $2 ".csv" }' file.csv

1
มีawkการใช้งานบั๊กกี้ที่ไม่สามารถprint > $2 ".cvs"ใช้ได้ ในวันที่คุณจะต้องมีการคำนวณครั้งแรกที่ชื่อไฟล์แล้วทำ:print fname = $2 ".cvs"; print > fname
Kusalananda

3

ฉันชอบawkวิธีการแก้ปัญหาของ terdon แต่เพื่อความสมบูรณ์นี่คือคำแนะนำที่ใช้เท่านั้นbash

while IFS=, read -r a1 a2 a3 a4; do 
    echo "$a1,$a2,$a3,$a4" >> "$a2".csv
done < file.csv

มันจะสร้างไฟล์577.csvและ132.csvในไดเรกทอรีปัจจุบัน


3

เพื่อแยกทั้งหมด 577 ถึง stdout

grep -e '^.*,577,.*,.*$' youfile.csv >result_extract_557.csv

- แก้ไข 1 แก้ไขแล้วตามความเห็นของ @ terdon ด้านล่างเพื่อหลีกเลี่ยงการจับคู่ที่ผิดพลาดเมื่อมีเครื่องหมายจุลภาคอย่างน้อย 3 บรรทัดสอดคล้องกับ 577

grep -e '^[:alnum:]*,577,[:digit:]*,[:digit:]*$' youfile.csv >result_extract_557.csv

แต่ฉันคิดว่าawkวิธีการแก้ปัญหาของเขา / เธอจะครอบคลุมมากขึ้น


ที่จะตรงกันแม้ว่า 577 อยู่ในเขตข้อมูลอื่นไม่ใช่ที่สองหรือถ้ามันเป็นส่วนหนึ่งของเขตข้อมูล ยกตัวอย่างเช่นหรือfoo577bar yp9012,132,8,577
terdon

ฉันคิดว่าเครื่องหมายจุลภาคของฉันจะทำให้มันขึ้นอยู่กับตำแหน่งของฟิลด์?
X Tian

ขออภัยฉันให้ตัวอย่างที่ไม่ดี แต่.*ยังสามารถจับคู่เครื่องหมายจุลภาคเพื่อให้คุณไม่ทราบว่าคุณกำลังจับคู่ฟิลด์ใด อาจเป็นวินาทีหรืออาจเป็น 45 ก็ได้ foo577barร้องเรียนที่สองของฉันเป็นความผิดคุณขวาที่จุลภาคปกป้องจากการจับคู่
terdon

จะทำอย่างไรถ้า | อักขระถูกใช้แทน,.
user3116123

ได้รับด้านล่างข้อผิดพลาด grep: ตัวเลือกที่ผิดกฎหมาย - การใช้งาน e: grep -hblcnsviw รูปแบบไฟล์ . .
user3116123

1

การใช้csvkit:

$ csvgrep -c 2 -m 577 data.csv >output.csv

-c 2ทำให้cvsgrepพิจารณาคอลัมน์ที่สองและด้วยความ-m 577ที่เราขอให้ตรงกับสตริง577ในคอลัมน์นั้น

ต่อไปนี้จะถูกเขียนถึงoutput.csv:

yp1234,577,1,3
yp5678,577,3,5

ในการจับคู่สตริงจำนวนหนึ่งและเขียนเอาต์พุตไปยังไฟล์สำหรับแต่ละสตริง:

for pattern in 577 132; do
  csvgrep -c 2 -m "$pattern" data.csv >"output-$pattern.csv"
done

นี้จะสร้างสองไฟล์และoutput-132.csvoutput-577.csv

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.