เข้าร่วมหลายคำสั่ง sed ในหนึ่งสคริปต์เพื่อประมวลผลไฟล์ CSV


34

มีไฟล์ CSV ดังนี้:

HEADER
"first, column"|"second "some random quotes" column"|"third ol' column"
FOOTER

และมองหาผลลัพธ์เช่น:

HEADER
first, column|second "some random quotes" column|third ol' column

กล่าวอีกนัยหนึ่งคือการลบ "FOOTER" เครื่องหมายคำพูดในจุดเริ่มต้นจุดสิ้นสุดและรอบ ๆ |

จนถึงตอนนี้รหัสนี้ทำงาน:

sed '/FOOTER/d' csv > csv1 | #remove FOOTER
sed 's/^\"//' csv1 > csv2 | #remove quote at the beginning
sed 's/\"$//' csv2 > csv3 | #remove quote at the end
sed 's/\"|\"/|/g' csv3 > csv4 #remove quotes around pipe

ในขณะที่คุณเห็นปัญหาคือมันสร้างไฟล์พิเศษ 4 ไฟล์

นี่เป็นอีกวิธีการหนึ่งที่มีเป้าหมายที่จะไม่สร้างไฟล์เพิ่มเติมและทำสิ่งเดียวกันในสคริปต์เดียว มันใช้งานไม่ได้ดีมาก

#!/bin/ksh

sed '/begin/, /end/ { 
        /FOOTER/d
        s/^\"//
        s/\"$//
        s/\"|\"/|/g 
}' csv > csv4

1
เมื่อคุณมีคำพูดคุณสามารถมีการขึ้นบรรทัดใหม่ในฟิลด์ คุณsedจะไม่ทำงานกับสิ่งนั้นด้วย csv แบบง่าย ๆ เท่านั้น ใช้ภาษาการเขียนโปรแกรมกับไลบรารีที่สามารถจัดการไฟล์ CSV จริง (Python / Perl / Ruby)
Anthon

คำตอบ:


44

ก่อนอื่นอย่างที่ไมเคิลแสดงให้เห็นคุณสามารถรวมสิ่งเหล่านี้เป็นคำสั่งเดียว:

sed '/^FOOTER/d; s/^\"//; s/\"$//; s/\"|\"/|/g' csv > csv1

ฉันคิดว่าsedการใช้งานบางอย่างไม่สามารถรับมือกับสิ่งนั้นได้และอาจต้อง:

  sed -e '/^FOOTER/d' -e 's/^\"//' -e 's/\"$//' -e 's/\"|\"/|/g' csv > csv1

ที่กล่าวไว้ดูเหมือนว่าฟิลด์ของคุณจะถูกกำหนดโดย|และคุณเพียงต้องการลบ"รอบ ๆ ฟิลด์ทั้งหมดออกจากฟิลด์ที่อยู่ในฟิลด์ ในกรณีนั้นคุณสามารถทำได้:

$ sed '/FOOTER/d; s/\(^\||\)"/\1/g; s/"\($\||\)/\1/g' csv 
HEADER
first, column|second "some random quotes" column|third ol' column

หรือด้วย GNU sed:

sed -r '/FOOTER/d; s/(^|\|)"/\1/g; s/"($|\|)/\1/g' csv 

คุณสามารถใช้ Perl:

$ perl -F"|" -lane 'next if /FOOTER/; s/^"|"$// for @F; print @F' csv 
HEADER
first, column|second some random quotes column|third ol' column

13

สิ่งนี้จะได้ผล:

sed 's / ^ "//; s /" | "/ | / g; s /" "$ /" /'

ตัวอย่าง:

$ echo '"this"|" and "ths""|" and "|" this 2"|" also "this", "thi", "and th""' | 
sed 's/^"//; s/"|"/|/g; s/""$/"/'
this| and "ths"| and | this 2| also "this", "thi", "and th"

รุ่นสวย

sed '
s/^"//
s/"|"/|/g
s/""$/"/
$d
'

1
สิ่งนี้ไม่จัดการกับส่วนท้าย
terdon

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