Grep จำนวนมากของรูปแบบจากไฟล์ขนาดใหญ่


18

ฉันมีไฟล์ที่เติบโตประมาณ 200,000 บรรทัดต่อวันและมันถูกสร้างขึ้นด้วยบล็อกสามบรรทัดเช่น:

1358726575123       # key
    Joseph Muller   # name
    carpenter       # job
9973834728345
    Andres Smith
    student
7836472098652
    Mariah Anthony
    dentist

ตอนนี้ผมมีไฟล์อื่นจากที่ผมดึงประมาณ 10,000 1358726575123รูปแบบที่สำคัญเช่น จากนั้นฉันเรียกใช้forลูปที่มีรูปแบบเหล่านี้และต้องตรวจสอบกับไฟล์แรก หากไฟล์ไม่มีรูปแบบดังกล่าวฉันบันทึกรูปแบบในไฟล์ที่สามเพื่อการประมวลผลเพิ่มเติม:

for number in $(grep -o '[0-9]\{12\}' file2); do  # finds about 10.000 keys
     if ! grep -q ^$number$ file1; then           # file1 is a huge file
         printf "$number\n" >>file3               # we'll process file3 later
     fi
done

รหัสตัวอย่าง greps ไฟล์ขนาดใหญ่ 10,000 ครั้งและผมทำงานเกี่ยวกับวงนี้นาทีละครั้งในช่วงตลอดทั้งวัน

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


คำตอบ:


11

คำตอบนี้ขึ้นอยู่กับawkคำตอบที่โพสต์โดยpotong ..
มันเร็วเป็นสองเท่าของcommวิธี (ในระบบของฉัน), สำหรับ6 ล้านบรรทัดเดียวกันในไฟล์หลักและ10,000คีย์ ... (ปรับปรุงตอนนี้ให้ใช้ FNR, NR)

แม้ว่าawkจะเร็วกว่าระบบปัจจุบันของคุณและจะช่วยให้คุณและคอมพิวเตอร์ของคุณมีพื้นที่สำหรับการหายใจโปรดทราบว่าเมื่อการประมวลผลข้อมูลมีความเข้มข้นตามที่คุณอธิบายไว้คุณจะได้รับผลลัพธ์โดยรวมที่ดีที่สุดโดยเปลี่ยนเป็นฐานข้อมูลเฉพาะ เช่น. SQlite, MySQL ...


awk '{ if (/^[^0-9]/) { next }              # Skip lines which do not hold key values
       if (FNR==NR) { main[$0]=1 }          # Process keys from file "mainfile"
       else if (main[$0]==0) { keys[$0]=1 } # Process keys from file "keys"
     } END { for(key in keys) print key }' \
       "mainfile" "keys" >"keys.not-in-main"

# For 6 million lines in "mainfile" and 10 thousand keys in "keys"

# The awk  method
# time:
#   real    0m14.495s
#   user    0m14.457s
#   sys     0m0.044s

# The comm  method
# time:
#   real    0m27.976s
#   user    0m28.046s
#   sys     0m0.104s


มันเร็ว แต่ฉันไม่เข้าใจมากนัก: ชื่อไฟล์ควรเป็นอย่างไร ฉันพยายามfile1 -> mainfileและfile2 -> keysด้วยเพ่งพิศและเหยี่ยวและมันออกคีย์ผิด
Teresa e Junior

file1 มีกุญแจชื่อและงาน
Teresa e Junior

'mainfile' เป็นไฟล์ขนาดใหญ่ (พร้อมคีย์ชื่อและงาน) ฉันเพิ่งเรียกมันว่า "mainfile" เพราะฉันยังคงสับสนอยู่กับว่าไฟล์ใด (file1 vs file2) .. 'keys' มีเพียง 10,000 คีย์หรือหลาย ๆ ปุ่ม .. สำหรับ situaton ของคุณจะไม่เปลี่ยนเส้นทางใด ๆ .. เพียงแค่ใช้file1 EOF file2 พวกเขาเป็นชื่อไฟล์ของคุณ .. "EOF" เป็นไฟล์ 1 บรรทัดสร้างโดยสคริปต์เพื่อระบุจุดสิ้นสุดของไฟล์แรก (ไฟล์ข้อมูลหลัก) และจุดเริ่มต้นของไฟล์ที่สอง ( คีย์) awkอนุญาตให้คุณอ่านไฟล์หลายชุด .. ในกรณีนี้ซีรีส์มีไฟล์อยู่3ไฟล์เอาท์พุทไปที่stdout
Peter.O

สคริปต์นี้จะพิมพ์คีย์ใด ๆ ที่มีอยู่ในปัจจุบันmainfile, และก็ยังจะพิมพ์คีย์ใด ๆ จากkeysไฟล์ที่ไม่ได้อยู่ในmainfile... นั่นอาจจะเป็นสิ่งที่เกิดขึ้น ... (ฉันจะมองบิตต่อไปในมัน ...
Peter.O

ขอบคุณ @ Peter.O! เนื่องจากไฟล์เป็นความลับฉันจึงพยายามสร้างไฟล์ตัวอย่างพร้อม$RANDOMสำหรับการอัปโหลด
Teresa e Junior

16

แน่นอนปัญหาคือคุณรัน grep ในไฟล์ขนาดใหญ่ 10,000 ครั้ง คุณควรอ่านทั้งสองไฟล์เพียงครั้งเดียว หากคุณต้องการอยู่นอกภาษาสคริปต์คุณสามารถทำได้ด้วยวิธีนี้:

  1. แยกตัวเลขทั้งหมดจากไฟล์ 1 และเรียงลำดับ
  2. แยกตัวเลขทั้งหมดจากไฟล์ 2 และจัดเรียง
  3. เรียกใช้commบนรายการที่เรียงลำดับเพื่อรับสิ่งที่อยู่ในรายการที่สองเท่านั้น

บางสิ่งเช่นนี้

$ grep -o '^[0-9]\{12\}$' file1 | sort -u -o file1.sorted
$ grep -o  '[0-9]\{12\}'  file2 | sort -u -o file2.sorted
$ comm -13 file1.sorted file2.sorted > file3

man commดู

หากคุณสามารถตัดทอนไฟล์ขนาดใหญ่ทุกวัน (เช่นไฟล์บันทึก) คุณสามารถเก็บแคชของตัวเลขที่เรียงและไม่จำเป็นต้องแยกมันทั้งหมดทุกครั้ง


1
เรียบร้อย! 2 วินาที (บนไดรฟ์ที่ไม่เร็วโดยเฉพาะ) กับ 200,000 รายการสุ่มบรรทัดใน mainfile (เช่น. 600,000 บรรทัด) และ 143,000 ปุ่มสุ่ม (นั่นเป็นเพียงแค่ข้อมูลการทดสอบของฉันสิ้นสุดลง) ... ผ่านการทดสอบแล้วและใช้งานได้ (แต่คุณรู้ว่า ) ... ฉันจะสงสัยเกี่ยวกับ{12}.. OP ได้ใช้ 12 แต่คีย์ตัวอย่าง 13 ยาว ...
Peter.O

2
เพียงเล็กน้อยคุณสามารถทำได้โดยไม่ต้องจัดการกับไฟล์ชั่วคราวโดยใช้<(grep...sort)ที่ชื่อไฟล์
Kevin

ขอบคุณ แต่การ grepping และการเรียงลำดับไฟล์ใช้เวลานานกว่าลูปก่อนหน้าของฉัน (+ 2 นาที)
Teresa e Junior

@ Teresa e Junior ไฟล์หลักของคุณใหญ่แค่ไหน? ... คุณพูดถึงว่ามันเติบโตที่ 200,000 บรรทัดต่อวัน แต่ไม่ใช่ว่ามันจะใหญ่แค่ไหน ... หากต้องการลดจำนวนข้อมูลที่คุณต้องดำเนินการคุณสามารถอ่านเพียง 200,000 บรรทัดของวันโดยการจดบันทึก หมายเลขบรรทัดสุดท้ายที่ประมวลผล (เมื่อวานนี้) และใช้tail -n +$linenumเพื่อส่งออกเฉพาะข้อมูลล่าสุด ด้วยวิธีนี้คุณจะสามารถประมวลผลได้วันละประมาณ 200,000 บรรทัด .. ฉันเพิ่งทดสอบมันด้วย6 ล้านบรรทัดในไฟล์หลักและ10,000คีย์ ... เวลา : จริง 0m0.016s, ผู้ใช้ 0m0.008s, 0m0.008s sys
Peter.O

ฉันจริงๆค่อนข้างงง / อยากรู้เกี่ยวกับวิธีการที่คุณสามารถ grep ไฟล์หลักของคุณ10,000ครั้งและพบว่ามันเร็วกว่าวิธีนี้เท่านั้นที่ greps มันครั้งเดียว (และครั้งเดียวที่มีขนาดเล็กมากfile1 ) ... แม้ว่าการจัดเรียงของคุณใช้เวลานานกว่าฉัน การทดสอบผมก็ไม่สามารถรับหัวของฉันรอบความคิดที่ว่าอ่านใหญ่แฟ้มที่หลายต่อหลายครั้งไม่เกินดุลการจัดเรียงที่เดียว (TimeWise)
Peter.O

8

ใช่ใช้ฐานข้อมูลอย่างแน่นอน พวกมันถูกสร้างขึ้นมาเพื่องานเช่นนี้


ขอบคุณ! ฉันไม่ค่อยมีประสบการณ์เกี่ยวกับฐานข้อมูล คุณแนะนำฐานข้อมูลใด ฉันมี MySQL และคำสั่ง sqlite3 ติดตั้งแล้ว
Teresa e Junior

1
พวกมันทั้งคู่ปรับได้ดี sqlite นั้นง่ายกว่าเพราะมันเป็นแค่ไฟล์และ SQL API สำหรับเข้าถึง ด้วย MySQL คุณต้องตั้งค่าเซิร์ฟเวอร์ MySQL เพื่อใช้งาน ในขณะที่ไม่ยากมากเช่นกัน sqlite อาจเป็นการเริ่มต้นที่ดีที่สุด
มิกะฟิสเชอร์

3

สิ่งนี้อาจใช้ได้กับคุณ:

 awk '/^[0-9]/{a[$0]++}END{for(x in a)if(a[x]==1)print x}' file{1,2} >file3

แก้ไข:

แก้ไขสคริปต์เพื่ออนุญาตการทำซ้ำและคีย์ที่ไม่รู้จักในทั้งสองไฟล์ยังคงสร้างคีย์จากไฟล์แรกที่ไม่มีอยู่ในไฟล์ที่สอง:

 awk '/^[0-9]/{if(FNR==NR){a[$0]=1;next};if($0 in a){a[$0]=2}}END{for(x in a)if(a[x]==1)print x}' file{1,2} >file3

การทำเช่นนี้จะทำให้พลาดคีย์ใหม่ที่เกิดขึ้นมากกว่าหนึ่งครั้งในไฟล์หลัก (และสำหรับเรื่องนั้นซึ่งเกิดขึ้นมากกว่าหนึ่งครั้งในไฟล์คีย์) ดูเหมือนว่าจะต้องมีการนับจำนวนอาร์เรย์ที่เพิ่มขึ้นของไฟล์หลักไม่เกิน 1 หรือวิธีแก้ปัญหาเทียบเท่า (+1 เพราะมันเป็นสวยใกล้เคียงกับเครื่องหมาย)
Peter.O

1
ฉันลองใช้ gawk และ mawk และมันจะทำหน้าที่ผิดพลาด ...
Teresa e Junior

@ Peter.OI สมมติว่าไฟล์หลักมีคีย์ที่ไม่ซ้ำกันและไฟล์ 2 นั้นเป็นส่วนย่อยของไฟล์หลัก
potong

@potong คนที่สองทำงานได้ดีและรวดเร็วมาก! ขอขอบคุณ!
Teresa e Junior

@Theresa e Juniorคุณแน่ใจหรือไม่ว่าทำงานได้อย่างถูกต้องหรือไม่ .. การใช้ข้อมูลทดสอบที่คุณให้ไว้ซึ่งควรส่งออก5,000คีย์เมื่อฉันเรียกใช้มันจะสร้างคีย์136703เหมือนที่ฉันได้จนกว่าฉันจะเข้าใจสิ่งที่คุณต้องการ ... @potongแน่นอน! FNR == NR (ฉันไม่เคยใช้มาก่อน :)
Peter.O

2

ด้วยข้อมูลจำนวนมากคุณควรเปลี่ยนไปใช้ฐานข้อมูลจริงๆ ในระหว่างนี้สิ่งหนึ่งที่คุณต้องทำเพื่อให้ได้ใกล้เคียงกับประสิทธิภาพที่เหมาะสมคือไม่ต้องค้นหาfile1แยกต่างหากสำหรับแต่ละคีย์ เรียกใช้grepปุ่มเดียวเพื่อแยกกุญแจที่ไม่ได้รับการยกเว้นทั้งหมดในครั้งเดียว เนื่องจากgrepยังส่งคืนบรรทัดที่ไม่มีคีย์ให้กรองรายการเหล่านั้นออกไป

grep -o '[0-9]\{12\}' file2 |
grep -Fxv -f - file1 |
grep -vx '[0-9]\{12\}' >file3

( -Fxหมายถึงการค้นหาทั้งบรรทัด-f -หมายถึงการอ่านรายการรูปแบบจากอินพุตมาตรฐาน)


นอกจากว่าฉันเข้าใจผิดนี่ไม่ได้แก้ปัญหาการจัดเก็บคีย์ที่ไม่ได้อยู่ในไฟล์ขนาดใหญ่มันจะเก็บกุญแจที่อยู่ในนั้น
Kevin

@ เควินอย่างแน่นอนและนี่ทำให้ฉันต้องใช้วงวน
Teresa e Junior

@TesesaeJunior: การเพิ่ม-v( -Fxv) อาจดูแลได้
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

@DennisWilliamson ที่จะรับสายทั้งหมดในไฟล์ขนาดใหญ่ที่ไม่ตรงกับในไฟล์ที่สำคัญรวมทั้งชื่อ, งาน, ฯลฯ
เควิน

@ เควินขอบคุณฉันผิดคำถาม ฉันได้เพิ่มตัวกรองสำหรับสายที่ไม่สำคัญ แต่ค่าของฉันตอนนี้ไปใช้ comm
Gilles 'หยุดความชั่วร้าย'

2

อนุญาตให้ฉันเสริมสิ่งที่ผู้อื่นพูดว่า "ไปที่ฐานข้อมูล!"

มีMySQL ไบนารีที่ใช้ได้อย่างอิสระสำหรับแพลตฟอร์มส่วนใหญ่

ทำไมไม่ใช้ SQLite มันขึ้นอยู่กับหน่วยความจำโหลดไฟล์แฟล็ตเมื่อคุณเริ่มแล้วปิดเมื่อคุณทำเสร็จแล้ว ซึ่งหมายความว่าหากคอมพิวเตอร์ของคุณขัดข้องหรือกระบวนการ SQLite หายไปข้อมูลทั้งหมดก็เช่นกัน

ปัญหาของคุณดูเหมือน SQL สองบรรทัดและจะทำงานในหน่วยมิลลิวินาที!

หลังจากติดตั้ง MySQL (ซึ่งฉันแนะนำให้เลือกมากกว่าตัวเลือกอื่น ๆ ) ฉันจะจ่าย $ 40 สำหรับSQL Cookbookของ O'Reilly โดย Anthony Molinaro ซึ่งมีรูปแบบปัญหามากมายเริ่มต้นด้วยSELECT * FROM tableคำสั่งง่ายๆและผ่านการรวมและการรวมหลายรายการ


ใช่ฉันจะเริ่มย้ายข้อมูลของฉันไปยัง SQL ภายในสองสามวันขอบคุณ! สคริปต์ awk ช่วยฉันมากมายจนกระทั่งฉันทำทุกอย่างเสร็จแล้ว!
Teresa e Junior

1

ฉันไม่แน่ใจว่านี่เป็นผลลัพธ์ที่แน่นอนที่คุณต้องการหรือไม่ แต่อาจเป็นวิธีที่ง่ายที่สุดคือ:

grep -o '[0-9]\{12\}' file2 | sed 's/.*/^&$/' > /tmp/numpatterns.grep
grep -vf /tmp/numpatterns.grep file1 > file3
rm -f /tmp/numpatterns.grep

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

sed -ne '/.*\([0-9]\{12\}.*/^\1$/p' file2 > /tmp/numpatterns.grep
grep -vf /tmp/numpatterns.grep file1 > file3
rm -f /tmp/numpatterns.grep

แต่ละรายการเหล่านี้สร้างไฟล์รูปแบบชั่วคราวซึ่งใช้เพื่อรวบรวมตัวเลขจากไฟล์ขนาดใหญ่ ( file1)


ฉันเชื่อว่าสิ่งนี้จะค้นหาตัวเลขที่อยู่ในไฟล์ขนาดใหญ่ด้วย
Kevin

ถูกต้องฉันไม่เห็น '!' ใน OP เพียงแค่ต้องใช้ แทนgrep -vf grep -f
Arcege

2
ไม่ @arcege, grep -vf จะไม่แสดงคีย์ที่ไม่ตรงกันมันจะแสดงทุกอย่างรวมถึงชื่อและงาน
Teresa e Junior

1

ฉันเห็นด้วยอย่างยิ่งกับคุณที่จะได้รับฐานข้อมูล (MySQL นั้นใช้งานง่าย) จนกว่าคุณจะได้รับที่ทำงานผมชอบแองกัสcommวิธีการแก้ปัญหา แต่ผู้คนจำนวนมากกำลังพยายามด้วยgrepและได้รับมันผิดที่ฉันคิดว่าฉันจะแสดงวิธีที่ (หรืออย่างน้อยหนึ่งครั้ง) grepที่ถูกต้องที่จะทำกับ

grep -o '[0-9]\{12\}' keyfile | grep -v -f <(grep -o '^[0-9]\{12\}' bigfile) 

คนแรกที่grepได้รับกุญแจ ที่สามgrep(ใน<(...)) ใช้ปุ่มทั้งหมดที่ใช้ในไฟล์ขนาดใหญ่และ<(...)ผ่านมันเหมือนไฟล์เป็นอาร์กิวเมนต์-fใน grep ที่สอง นั่นเป็นสาเหตุทำให้ตัวที่สองgrepใช้เป็นรายการของบรรทัดที่ตรงกัน จากนั้นใช้สิ่งนี้เพื่อจับคู่อินพุต (รายการของคีย์) จากไปป์ (ก่อนgrep) และพิมพ์คีย์ใด ๆ ที่ดึงมาจากไฟล์คีย์และไม่ใช่ ( -v) ไฟล์ขนาดใหญ่

แน่นอนคุณสามารถทำได้ด้วยไฟล์ชั่วคราวที่คุณต้องติดตามและอย่าลืมลบ:

grep -o '[0-9]\{12\}'  keyfile >allkeys
grep -o '^[0-9]\{12\}' bigfile >usedkeys
grep -v -f usedkeys allkeys

พิมพ์นี้ทุกสายในที่ไม่ปรากฏในallkeysusedkeys


น่าเสียดายที่มันช้าและฉันได้รับข้อผิดพลาดของหน่วยความจำหลังจาก 40 วินาที:grep: Memory exhausted
Peter.O

@ Peter.O แต่มันถูกต้อง อย่างไรก็ตามนั่นคือเหตุผลที่ฉันแนะนำฐานข้อมูลหรือcommในลำดับที่
Kevin

ใช่มันใช้งานได้ แต่ช้ากว่าลูปมาก
Teresa e Junior

1

keyfile ไม่เปลี่ยนแปลง? จากนั้นคุณควรหลีกเลี่ยงการค้นหารายการเก่าซ้ำแล้วซ้ำอีก

ด้วยtail -fคุณสามารถรับเอาท์พุทของไฟล์ที่กำลังเติบโต

tail -f growingfile | grep -f keyfile 

grep -f อ่านรูปแบบจากไฟล์หนึ่งบรรทัดเป็นรูปแบบ


นั่นน่าจะดี แต่ไฟล์คีย์ต่างกันเสมอ
Teresa e Junior

1

จะไม่โพสต์คำตอบของฉันเพราะฉันคิดว่าจำนวนข้อมูลดังกล่าวไม่ควรถูกประมวลผลด้วยเชลล์สคริปท์และคำตอบที่ถูกต้องในการใช้ฐานข้อมูลนั้นได้รับแล้ว แต่เนื่องจากตอนนี้มี 7 วิธีอื่น ๆ ...

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

declare -a record
while read key
do
    read name
    read job
    record[$key]="$name:$job"
done < file1

for number in $(grep -o '[0-9]\{12\}' file2)
do
    [[ -n ${mylist[$number]} ]] || echo $number >> file3
done

ฉันมีหน่วยความจำเพียงพอ แต่ฉันพบว่านี่ช้าลง ขอบคุณนะ!
Teresa e Junior

1

ฉันเห็นด้วยกับ@ jan-steinmanว่าคุณควรใช้ฐานข้อมูลสำหรับงานประเภทนี้ มีหลายวิธีที่จะแฮ็คโซลูชันด้วยเชลล์สคริปต์ตามคำตอบอื่น ๆ ที่แสดง แต่การทำเช่นนั้นจะนำไปสู่ความเดือดร้อนมากมายหากคุณจะใช้และบำรุงรักษาโค้ดในระยะเวลานานกว่า เป็นเพียงโครงการหนึ่งวัน

สมมติว่าคุณอยู่ในกล่อง Linux คุณน่าจะติดตั้ง Python เป็นค่าเริ่มต้นซึ่งรวมถึงไลบรารี sqlite3ตั้งแต่ Python v2.5 คุณสามารถตรวจสอบเวอร์ชั่น Python ของคุณด้วย:

% python -V
Python 2.7.2+

ฉันขอแนะนำให้ใช้ไลบรารี sqlite3เพราะเป็นวิธีแก้ปัญหาไฟล์ที่ใช้ง่ายสำหรับทุกแพลตฟอร์ม (รวมถึงภายในเว็บเบราว์เซอร์ของคุณ!) และไม่จำเป็นต้องติดตั้งเซิร์ฟเวอร์ พื้นฐานการกำหนดค่าเป็นศูนย์และการบำรุงรักษาเป็นศูนย์

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

#!/usr/bin/env python

import sqlite3
import sys

dbname = '/tmp/simple.db'
filename = '/tmp/input.txt'
with sqlite3.connect(dbname) as conn:
    conn.execute('''create table if not exists people (key integer primary key, name text, job text)''')
    with open(filename) as f:
        for key in f:
            key = key.strip()
            name = f.next().strip()
            job = f.next().strip()
            try:
                conn.execute('''insert into people values (?,?,?)''', (key, name, job))
            except sqlite3.IntegrityError:
                sys.stderr.write('record already exists: %s, %s, %s\n' % (key, name, job))
    cur = conn.cursor()

    # get all people
    cur.execute('''select * from people''')
    for row in cur:
        print row

    # get just two specific people
    person_list = [1358726575123, 9973834728345]
    cur.execute('''select * from people where key in (?,?)''', person_list)
    for row in cur:
        print row

    # a more general way to get however many people are in the list
    person_list = [1358726575123, 9973834728345]
    template = ','.join(['?'] * len(person_list))
    cur.execute('''select * from people where key in (%s)''' % (template), person_list)
    for row in cur:
        print row

ใช่นี่หมายความว่าคุณจะต้องเรียนรู้ SQL บางอย่างแต่จะคุ้มค่าในระยะยาว นอกจากนี้แทนที่จะวิเคราะห์ไฟล์บันทึกของคุณบางทีคุณอาจเขียนข้อมูลโดยตรงไปยังฐานข้อมูล sqlite ของคุณ


ขอบคุณสำหรับสคริปต์ไพ ธ อน! ฉันคิดว่า/usr/bin/sqlite3ทำงานในลักษณะเดียวกันสำหรับเชลล์สคริปต์ ( packages.debian.org/squeeze/sqlite3 ) แต่ฉันไม่เคยใช้เลย
Teresa e Junior

ใช่คุณสามารถใช้/usr/bin/sqlite3กับเชลล์สคริปต์ได้ แต่ฉันแนะนำให้หลีกเลี่ยงเชลล์สคริปต์ยกเว้นโปรแกรมที่ใช้งานง่ายและใช้ภาษาอย่างหลามแทนซึ่งมีข้อผิดพลาดที่ดีกว่าและง่ายต่อการบำรุงรักษาและการเติบโต
aculich
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.