คำถามติดแท็ก text-processing

การจัดการหรือตรวจสอบข้อความโดยโปรแกรมสคริปต์ ฯลฯ

2
เครื่องมือในยูนิกซ์เพื่อลบไฟล์ข้อความ?
ฉันมีไฟล์ขนาดใหญ่ประกอบด้วยเขตข้อมูลข้อความคั่นด้วยเครื่องหมายอัฒภาคในรูปแบบของตารางขนาดใหญ่ มันได้รับการจัดเรียง ฉันมีไฟล์ขนาดเล็กที่ประกอบด้วยฟิลด์ข้อความเดียวกัน เมื่อถึงจุดหนึ่งบางคนต่อไฟล์นี้กับผู้อื่นแล้วเรียงลำดับเพื่อจัดทำไฟล์ขนาดใหญ่ที่อธิบายไว้ข้างต้น ฉันต้องการลบเส้นของไฟล์ขนาดเล็กออกจากไฟล์ใหญ่ (เช่นสำหรับแต่ละบรรทัดในไฟล์ขนาดเล็กหากมีสตริงการจับคู่อยู่ในไฟล์ขนาดใหญ่ให้ลบบรรทัดนั้นในไฟล์ขนาดใหญ่) ไฟล์มีลักษณะเช่นนี้โดยประมาณ GenericClass1; 1; 2; NA; 3; 4; GenericClass1; 5; 6; NA; 7; 8; GenericClass2; 1; 5; NA; 3; 8; GenericClass2; 2; 6; NA; 4; 1; ฯลฯ มีวิธีที่ดีงามอย่างรวดเร็วในการทำเช่นนี้หรือฉันต้องใช้ awk?

3
ฉันจะลบข้อความก่อนตัวคั่นใน Linux ได้อย่างไร
ฉันต้องการลบข้อความออกจากบรรทัดก่อนตัวคั่น ตัวอย่างเช่น: (123434): hello::{apple,orange,mango}. :ฉันต้องการที่จะลบข้อความก่อนเป็นครั้งแรก (123434)กล่าวคือ มีคำสั่งใดใน linux ที่จะทำงานนี้หรือไม่?

8
แทนที่สตริงที่มีการขึ้นบรรทัดใหม่ในไฟล์ขนาดใหญ่
มีใครรู้บ้างเกี่ยวกับเครื่องมือที่ไม่ใช้บรรทัดในการค้นหา / แทนที่สตริงในวิธีที่ค่อนข้างมีประสิทธิภาพ ดูคำถามนี้ด้วย ฉันมีไฟล์ข้อความ + 2GB ที่ฉันต้องการประมวลผลคล้ายกับสิ่งที่ดูเหมือนจะทำ: sed -e 's/>\n/>/g' ซึ่งหมายความว่าผมต้องการที่จะลบบรรทัดใหม่ทั้งหมดที่เกิดขึ้นหลังจากที่มีแต่ไม่ได้ทุกที่อื่นดังนั้นกฎที่ออกมา>tr -d คำสั่งนี้ (ที่ฉันได้จากคำตอบของคำถามที่คล้ายกัน ) ล้มเหลวด้วยcouldn't re-allocate memory: sed --unbuffered ':a;N;$!ba;s/>\n/>/g' ดังนั้นมีวิธีการอื่นใดโดยไม่หันไปใช้ C? ฉันเกลียด Perl แต่ยินดีที่จะยกเว้นในกรณีนี้ :-) ฉันไม่รู้ว่าตัวละครใดที่ไม่ได้เกิดขึ้นในข้อมูลดังนั้นการแทนที่\nด้วยอักขระอื่นชั่วคราวเป็นสิ่งที่ฉันต้องการหลีกเลี่ยงถ้าเป็นไปได้ มีความคิดที่ดีมีใครบ้าง?

4
เปรียบเทียบสองคอลัมน์ของไฟล์ต่างกันและพิมพ์ถ้ามันตรงกัน
ฉันใช้ Solaris 10 และตัวเลือก grep ที่เกี่ยวข้องกับ -f ไม่ทำงาน ฉันมีไฟล์สองไฟล์ที่คั่นด้วย pipe: file1: abc|123|BNY|apple| cab|234|cyx|orange| def|kumar|pki|bird| ไฟล์ 2: abc|123| kumar|pki| cab|234 ฉันต้องการเปรียบเทียบสองคอลัมน์แรกของ file2 กับ file1 (ค้นหาเนื้อหาทั้งหมดของ file1 ในสองคอลัมน์แรก) หากตรงกับพิมพ์บรรทัดที่ตรงกันของ file1 จากนั้นค้นหาบรรทัดที่สองของไฟล์ 2 และอื่น ๆ ผลลัพธ์ที่คาดหวัง: abc|123|BNY|apple| cab|234|cyx|orange| ไฟล์ที่ฉันมีมีขนาดใหญ่มากมีประมาณ 400,000 บรรทัดดังนั้นฉันต้องการทำให้การดำเนินการเป็นไปอย่างรวดเร็ว

2
พิมพ์บรรทัดระหว่าง (และรวมถึง) สองรูปแบบ
ฉันต้องการเริ่ม grepping จากบรรทัดที่มีCKที่ส่วนท้ายของบรรทัดและหยุดการ grepping เมื่อบรรทัดมีDที่สิ้นสุด ฉันพยายามgrep "$CK" "$D" file..txtแต่มันใช้งานไม่ได้ การป้อนข้อมูล: kkkkkkkkkkk jjjjjjjjjjjjjjjjjj gggggggggggg/CK JHGHHHHHHHH HJKHKKLKLLL JNBHBHJKJJLKKL JLKKKLLKJLKJ/D GGGGGGGGGGGGGG GGGGGGGGGGGGGG ผลลัพธ์ที่ต้องการ: gggggggggggg/CK JHGHHHHHHHH HJKHKKLKLLL JNBHBHJKJJLKKL JLKKKLLKJLKJ/D

11
ฉันจะแยกไฟล์ข้อความเป็นไฟล์ข้อความหลายไฟล์ได้อย่างไร
ฉันมีไฟล์ข้อความที่เรียกentry.txtว่ามีดังต่อไปนี้: [ entry1 ] 1239 1240 1242 1391 1392 1394 1486 1487 1489 1600 1601 1603 1657 1658 1660 2075 2076 2078 2322 2323 2325 2740 2741 2743 3082 3083 3085 3291 3292 3294 3481 3482 3484 3633 3634 3636 3690 3691 3693 3766 3767 3769 4526 4527 4529 4583 …

1
วิธีลบบรรทัดที่ซ้ำกันใน textfile หลาย GB ขนาดใหญ่?
คำถามของฉันคล้ายกับคำถามนี้แต่มีข้อ จำกัด ที่แตกต่างกันสองข้อ: ฉันมี\nรายการคำศัพท์ที่คั่นขนาดใหญ่- หนึ่งคำต่อบรรทัด ขนาดไฟล์มีตั้งแต่ 2GB ถึงใหญ่ถึง 10GB ฉันต้องการลบบรรทัดที่ซ้ำกัน กระบวนการอาจเรียงลำดับรายการในระหว่างการลบรายการที่ซ้ำกัน แต่ไม่จำเป็น มีพื้นที่ว่างเพียงพอบนพาร์ติชันเพื่อเก็บ wordlist ใหม่ที่ไม่ซ้ำใคร ฉันลองทั้งสองวิธีนี้แล้ว แต่พวกเขาทั้งสองล้มเหลวโดยไม่มีข้อผิดพลาดของหน่วยความจำ sort -u wordlist.lst > wordlist_unique.lst awk '!seen[$0]++' wordlist.lst > wordlist_unique.lst awk: (FILENAME=wordlist.lst FNR=43601815) fatal: assoc_lookup: bucket-ahname_str: can't allocate 10 bytes of memory (Cannot allocate memory) ฉันจะลองวิธีอื่นได้อย่างไร

5
ค้นหาไฟล์ที่มีคำค้นหาหลาย ๆ คำในไฟล์
ฉันกำลังมองหาวิธีที่จะแสดงรายการไฟล์ทั้งหมดในไดเรกทอรีที่มีชุดคำหลักเต็มรูปแบบที่ฉันค้นหาทุกที่ในไฟล์ ดังนั้นคำหลักไม่จำเป็นต้องปรากฏในบรรทัดเดียวกัน วิธีหนึ่งในการทำเช่นนี้คือ: grep -l one $(grep -l two $(grep -l three *)) คำหลักสามคำเป็นเพียงตัวอย่างมันอาจมีสองหรือสี่คำเป็นต้น วิธีที่สองที่ฉันนึกได้คือ: grep -l one * | xargs grep -l two | xargs grep -l three วิธีที่สามที่ปรากฏในคำถามอื่นจะเป็น: find . -type f \ -exec grep -q one {} \; -a \ -exec grep -q two {} \; -a …

4
เก็บเอาต์พุตของคำสั่งลงในริงบัฟเฟอร์
ฉันมีคำสั่งที่ใช้เวลานานซึ่งสร้างเอาต์พุตจำนวนมากบน stdout ฉันต้องการเก็บตัวอย่างเช่นสามวันสุดท้ายหรือ gibibyte ล่าสุด (หลีกเลี่ยงการตัดเส้นตรงกลาง) และถ้าเป็นไปได้ในไฟล์ไฟล์ไม่เกิน 20 MiB แต่ละอันถูกตั้งชื่อด้วยส่วนต่อท้ายที่เป็นตัวเลขหรือเวลาประทับ สิ่งที่ต้องการ: my-cmd | magic-command --output-file-template=my-cmd-%t \ --keep-bytes=1G \ --keep-time=3d \ --max-chunk-size=20M \ --compress=xz จะเขียน: my-cmd-2014-09-05T10:04:23Z เมื่อถึง 20M มันจะบีบอัดและเปิดไฟล์ใหม่และอื่น ๆ หลังจากนั้นสักครู่มันจะเริ่มลบไฟล์ที่เก่าที่สุด คำสั่งดังกล่าวมีอยู่จริงหรือไม่? ฉันรู้logrotateและความสามารถในการจัดการไฟล์ที่เขียนโดยแอปพลิเคชั่นอื่น แต่ฉันกำลังมองหาสิ่งที่ง่ายกว่าที่ไม่เกี่ยวข้องกับการตั้งค่างาน cron ระบุกฎระงับกระบวนการ ฯลฯ

3
awk + print line เฉพาะเมื่อฟิลด์แรกเริ่มต้นด้วยสตริงเป็น Linux1
วิธีพิมพ์บรรทัดในกรณีที่ฟิลด์แรกเริ่มต้นด้วย Linux1 ตัวอย่างเช่น: echo Linux1_ver2 12542 kernel-update | awk '{if ($1 ~ Linux1 ) print $0;}' เป้าหมายคือการพิมพ์บรรทัดขณะที่ฟิลด์แรกเริ่มต้นด้วย Linux1 ตัวอย่างของเส้น: Linux1-new 36352 Version:true Linux1-1625543 9847 Linux1:16254 8467563 หมายเหตุ - ช่องว่างหรือ TAB อาจอยู่ก่อนการยื่นครั้งแรก

5
มีโปรแกรมอรรถประโยชน์บรรทัดคำสั่งเพื่อแปลงไฟล์ csv หรือไม่?
รับไฟล์แบบนี้ First,Last,Age Cory,Klein,27 John Jacob,Smith,30 มียูทิลิตีบรรทัดคำสั่งเพื่อย้ายเนื้อหาเพื่อให้ผลลัพธ์เป็นเช่นนั้นหรือไม่ First,Cory,John Jacob Last,Klein,Smith Age,27,30

5
วิธีการค้นหาและแทนที่สตริงโดยไม่ต้องใช้คำสั่ง Sed?
ในฐานะที่เราทุกคนรู้ว่าsedมีประสิทธิภาพอย่างมากในการค้นหาและแทนที่สตริงเช่นค้นหา 'a' และแทนที่มัน sed 's/a/b/g''B': เป็นไปได้ไหมที่จะทำสิ่งนี้กับคำสั่งหรือเชลล์สคริปต์แทนsed? นี่สำหรับระบบ linux ที่ถูกครอบตัดสำหรับทีวีที่ไม่มีsedคำสั่ง ดังนั้นฉันต้องใช้คำสั่งหรือสคริปต์อื่นแทนsed 's/a/b/g'. –

3
หัวกินอักขระพิเศษ
คำสั่ง shell ต่อไปนี้คาดว่าจะพิมพ์บรรทัดคี่ของอินพุตสตรีมเท่านั้น: echo -e "aaa\nbbb\nccc\nddd\n" | (while true; do head -n 1; head -n 1 >/dev/null; done) aaaแต่มันเป็นเพียงแค่พิมพ์บรรทัดแรก: สิ่งเดียวกันจะไม่เกิดขึ้นเมื่อใช้กับตัวเลือก-c( --bytes): echo 12345678901234567890 | (while true; do head -c 5; head -c 5 >/dev/null; done) คำสั่งนี้ส่งออก1234512345ตามที่คาดไว้ แต่นี้จะทำงานเฉพาะในcoreutilsการดำเนินงานของheadยูทิลิตี้ busybox12345การดำเนินงานยังคงกินอักขระพิเศษเพื่อการส่งออกเป็นเพียง ฉันเดาว่าวิธีการใช้งานเฉพาะอย่างนี้ทำเพื่อการเพิ่มประสิทธิภาพ คุณไม่สามารถรู้ได้ว่าเส้นไหนจะจบลงดังนั้นคุณจะไม่ทราบว่าต้องอ่านตัวอักษรกี่ตัว วิธีเดียวที่จะไม่ใช้อักขระพิเศษจากอินพุตสตรีมคือการอ่านสตรีมไบต์เป็นไบต์ แต่การอ่านจากสตรีมทีละหนึ่งไบต์อาจช้า ดังนั้นฉันเดาว่าheadอ่านอินพุตสตรีมไปยังบัฟเฟอร์ใหญ่พอสมควรแล้วนับจำนวนบรรทัดในบัฟเฟอร์นั้น ไม่สามารถพูดแบบเดียวกันสำหรับกรณีได้เมื่อใช้--bytesตัวเลือก ในกรณีนี้คุณรู้จำนวนไบต์ที่คุณต้องอ่าน ดังนั้นคุณอาจอ่านจำนวนไบต์นี้อย่างแน่นอนและไม่มากกว่านั้น corelibsการดำเนินการจะใช้โอกาสนี้ แต่busyboxหนึ่งไม่ก็ยังคงอ่านไบต์มากขึ้นกว่าที่จำเป็นเข้าไปในกันชน มันอาจทำเพื่อทำให้การใช้งานง่ายขึ้น ดังนั้นคำถาม …

5
การรวมไฟล์จำนวนมากเข้าด้วยกัน
ฉันมีไฟล์± 10,000 ไฟล์ ( res.1- res.10000) ทั้งหมดประกอบด้วยหนึ่งคอลัมน์และจำนวนแถวเท่ากัน สิ่งที่ฉันต้องการคือโดยพื้นฐานแล้วเรียบง่าย final.resรวมไฟล์ทุกคอลัมน์ที่ชาญฉลาดในไฟล์ใหม่ ฉันได้ลองใช้: paste res.* อย่างไรก็ตาม (ถึงแม้ว่าสิ่งนี้ดูเหมือนว่าจะทำงานกับไฟล์ย่อยเล็ก ๆ ของไฟล์ผลลัพธ์ แต่ก็ให้ข้อผิดพลาดต่อไปนี้เมื่อดำเนินการกับทั้งชุด: Too many open files. จะต้องมีวิธี 'ง่าย' ในการทำสิ่งนี้ แต่น่าเสียดายที่ฉันค่อนข้างใหม่กับยูนิกซ์ ขอบคุณล่วงหน้า! PS: เพื่อให้คุณมีความคิดเกี่ยวกับสิ่งที่ (หนึ่งใน) ของฉัน datafile (s) ดูเหมือนว่า: 0.5 0.5 0.03825 0.5 10211.0457 10227.8469 -5102.5228 0.0742 3.0944 ...

5
ฉันจะแปลงการประทับเวลาในคอลัมน์เป็นวันที่ได้อย่างไร
ฉันมีไฟล์ที่มีสิ่งนี้: 1415602803,LOGIN SUCCESS,AUTH,user2,192.168.203.63,10.146.124.73,59996,22 1415602807,LOGIN SUCCESS,AUTH,user1,172.24.31.10,172.32.1.1,48191,22 1415602811,LOGIN FAILED,AUTH,root,172.24.166.153,10.146.124.73,52506,22 1415602815,LOGIN FAILED,AUTH,user3,192.168.123.55,10.146.32.99,55750,22 ฉันต้องการแปลงเวลาเป็นวันที่ในรูปแบบนี้: 2014-11-10 02:00:03,LOGIN SUCCESS,AUTH,user2,192.168.203.63,10.146.124.73,59996,22 2014-11-10 02:00:07,LOGIN SUCCESS,AUTH,user1,172.24.31.10,172.32.1.1,48191,22 2014-11-10 02:00:11,LOGIN FAILED,AUTH,root,172.24.166.153,10.146.124.73,52506,22 2014-11-10 02:00:15,LOGIN FAILED,AUTH,user3,192.168.123.55,10.146.32.99,55750,22 ฉันจะทำสิ่งนั้นได้อย่างไร ฉันรู้ว่างานนี้: perl -pe 's/(\d+)/localtime($1)/e'(จากคำถามนี้ ) Mon Nov 10 02:00:03 2014แต่รูปแบบออกเป็น ฉันรู้ว่าคำสั่งนี้สามารถแปลงการประทับเวลาเป็นผลลัพธ์ที่ต้องการ: date -d@1415602803 +"%F %H:%M:%S"แต่ฉันไม่สามารถawkใช้งานได้system("cmd")เนื่องจากการใช้ใบเสนอราคาและอะไรก็ตาม

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