จะใช้แฟล็ก -p ของการแยก BSD ได้อย่างไร


1

คู่มือ

-p pattern
         The file is split whenever an input line matches pattern,
         which is interpreted as an extended regular expression.  The
         matching line will be the first line of the next output file.
         This option is incompatible with the -b and -l options.

รหัส

seq -w 1 1 10 | gsed ':a;N;$!ba;s/\n//g' | split -p '060'

ซึ่งจะทำให้ลำดับจาก 1 ถึง 10 เอาบรรทัดว่างจะมี megastring แล้วแยกที่เป็นสองไฟล์ไม่ประสบความสำเร็จให้060split: invalid option -- 'p'

คำสั่งseq -w 1 1 10 | awk -F'060' '{print "field1: "$1 "\nfield2: 060"$2}'ในการแสดงความคิดเห็นให้

field1: 01 field2: 060 field1: 02 field2: 060 field1: 03 field2: 060 field1: 04 field2: 060 field1: 05 field2: 060 field1: 06 field2: 060 field1: 07 field2: 060 field1: 060 09 field2: 060 field1: 10 field2: 060

ซึ่งไม่ใช่สิ่งที่ฉันต้องการ ฉันต้องการแยกไฟล์ที่เครื่องหมาย060เป็นสองไฟล์ คุณสามารถรวม060ถึงไฟล์ใดไฟล์หนึ่ง

คุณสามารถใช้ flag -p ใน BSD Split ใน OSX ได้อย่างไร


1
ความจริงที่ว่าคุณจะได้รับตัวเลือกที่ไม่ถูกต้อง split'แสดงให้เห็นว่าคุณอาจไม่ได้เรียกร้องที่ถูกต้อง อะไรwhich splitกลับมา?
mjturner

@mjturner ฉันได้เพิ่มเอาท์พุทของคำสั่งของคุณ ใช่ดูเหมือนว่ามีบางอย่างผิดปกติในระบบของฉัน คู่มือของฉันman splitเกี่ยวกับ BSD ในขณะที่จริงของฉันsplitเกี่ยวกับ GNU
LéoLéopold Hertz 준영

ทำไมคุณถึงไม่ได้ใช้ทั้งสองseqและgsedคำสั่งในขณะที่ทำหน้าที่แทนawkสำหรับsplit? การส่งออกคำสั่งต่อไปนี้เป็นสองสายหนึ่งfield1: 0102030405และอื่น ๆ field2: 0607080910คือ คำสั่งคือ:seq -w 1 1 10 | gsed ':a;N;$!ba;s/\n//g' | awk -F'060' '{print "field1: "$1 "\nfield2: 060"$2}'
user3439894

คำตอบ:


2

ปัญหาเกิดจากการแยก BSD ในภายหลังในเส้นทางของคุณมากกว่าการแยก GNU (ซึ่งไม่สนับสนุน-pตัวเลือก) หากคุณทำสิ่งที่echo $PATHคุณควรจะเห็น - /usr/local/opt/coreutils/libexec/gnubinจะเป็นก่อน/usr/binในการส่งออก

ที่จะเรียกแยก BSD โดยตรงใช้เส้นทางแบบเต็ม - ท่อแทน/usr/bin/splitsplit

คำสั่งดั้งเดิมของคุณจะกลายเป็น:

seq -w 1 1 10 | gsed ': a; N; $! ba; s / \ n // g' | แยก -p '060'

จะตั้งค่า PATH และ MANPATH ให้สอดคล้องกันได้อย่างไรว่าคำสั่งman splitเกี่ยวกับsplitคำสั่ง?
LéoLéopold Hertz 준영

หากคุณต้องการคำสั่ง GNU ที่ติดตั้งพร้อมคำนำหน้าคุณจะต้องติดตั้งใหม่ เมื่อเสร็จแล้วให้แก้ไข PATH และ MANPATH ของคุณในไฟล์การกำหนดค่าเชลล์ของคุณ คุณติดตั้งคำสั่ง GNU ได้อย่างไร ฉันมีความรู้สึกโดยรวบรวมด้วยมือ - ถ้าเป็นเช่นนั้นให้ใช้ตัวจัดการแพคเกจเช่น pkgsrc, MacPorts หรือ Homebrew ดีกว่าการรวบรวมจากแหล่งที่มา
mjturner

1
@Masi นั่นคือจากการออกแบบ splitแยกไฟล์หลายบรรทัดออกเป็นหลายไฟล์โดยใช้-pรูปแบบ ในขณะที่คุณใช้อินพุตเพียงบรรทัดเดียวนั่นคือสิ่งที่ส่งออก splitไม่แยกบรรทัดที่ตรงกัน แต่ใช้เป็นจุดเริ่มต้นของไฟล์ถัดไป หวังว่ามันสมเหตุสมผล!
mjturner

1
@mjturner awkคำสั่งที่เสนอของคุณจะแยกสตริงดังนั้นพูด แต่เอาท์พุททิ้ง "060" (ตามที่มันตั้งเป็นตัวคั่นเขตข้อมูล) จากสตริงและฉันเชื่อว่า Masi ไม่ต้องการทิ้งข้อมูล ต่อไปนี้เหมาะสมหรือไม่ awk -F'060' '{print "field1: "$1 "\nfield2: 060"$2}'
user3439894

1
@Masi ผมไม่ทราบว่าคุณกำลังได้รับทุกสาขาเหล่านั้นอย่างไรก็ตามการส่งออกคำสั่งต่อไปนี้เป็นสองสายหนึ่งfield1: 0102030405และอื่น ๆ field2: 0607080910คือ คำสั่งคือ:seq -w 1 1 10 | gsed ':a;N;$!ba;s/\n//g' | awk -F'060' '{print "field1: "$1 "\nfield2: 060"$2}'
user3439894

1

splitทำงานกับไฟล์หลายไฟล์ที่ไม่ได้อยู่ในไฟล์หรือสตริงเดี่ยว ในตัวอย่างด้านล่างที่ฉันใช้jotเพราะseqไม่ได้อยู่ในระบบของฉัน นอกจากนี้ฉันกำลังใช้ BSD sedด้วยการเพิ่มซึ่งเปลี่ยนเครื่องหมาย060เป็นโคลอน 0102030405:7080910นี้ผลิตสตริง เราเพิ่ม060ด้านหลังลงในไฟล์ที่สอง

    jot -w "%02d" 10 1                                     |
    sed -e ':a' -e 'N' -e '$!ba' -e 's/\n//g' -e 's/060/:/'|
    IFS=: read -r one two
    echo "$one" > file1
    echo "060${two}" > file2

สิ่งนี้jot -w "%02d" 10 1 | sed -e ':a' -e 'N' -e '$!ba' -e 's/\n//g' -e 's/060/:/' | IFS=: read -r one twoทำให้ฉันไม่มีอะไรเป็นเอาท์พุท อะไรคือผลลัพธ์ของคุณในระยะนั้น? ปัญหาเกิดขึ้นกับ IFS = ... ปัจจุบันของฉันใน Debian 8.1 นี่readคือตัวแปร Linux บางตัว
LéoLéopold Hertz 준영

0102030405:7080910ทั้งสองคำสั่งแรกให้ฉันได้อย่างถูกต้อง ฉันลองรับ OSX ในไม่ช้า ธงนี้-rกำลังทำอะไร ฉันลองทำกับ Debian 8.1 ตัวนี้
LéoLéopold Hertz 준영

1
bashฉันสมมติว่าคุณกำลังใช้ เพียงพิมพ์help readคำอธิบาย
fd0

ขอขอบคุณ! helpผมไม่ทราบว่า -r do not allow backslashes to escape any charactersฉันได้รับ
LéoLéopold Hertz 준영
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.