กรองข้อมูลด้วย sed


0

ฉันต้องการความช่วยเหลือ ฉันมีไฟล์เช่น

sometext line 1
sometext line 2
SU0000 
ID
ID
ID
sometext line 3
sometext line 4
sometext line 5
sometext line 6
SU0000 
ID
ID
ID
sometext line 7
sometext line 8

ฉันต้องการที่จะกรองข้อความเช่นที่เป็น

sometext line 2
SU0000 
ID
ID
ID
sometext line 6
SU0000 
ID
ID
ID

กล่าวอีกนัยหนึ่งฉันต้องการรับบรรทัดก่อนรูปแบบและทุกบรรทัดหลังจากที่เริ่มต้นด้วย ID

ฉันต้องการทำสิ่งนี้ในใจ ใครช่วยได้บ้าง


คุณอยู่patternที่นี่อะไร คุณบอกว่าคุณต้องการบรรทัดก่อนรูปแบบตามด้วยทุกบรรทัดที่ขึ้นต้นด้วยIDแต่ตัวอย่างของคุณมีsometext line 6คุณสามารถทำให้ชัดเจนหรือไม่?
ผ่อนผัน

สวัสดีผ่อนผันขอบคุณที่ตอบกลับ รูปแบบคือ 'SU' ฉันพยายามแยกหนึ่งบรรทัดเหนือรูปแบบนี้และบรรทัดต่อไปนี้ทั้งหมดที่เริ่มต้นด้วย ID จากนั้นทำซ้ำขั้นตอนนี้สำหรับไฟล์ขนาดใหญ่ที่มีข้อมูลดังกล่าว คุณเข้าใจไหม.
vinay

โปรดดูการแก้ไขของฉัน
MariusMatutiae

คำตอบ:


3

คุณไม่สามารถ. มันไม่ได้เป็นสิ่งที่sedถูกออกแบบมาเพื่อทำ

คุณสามารถทำได้ด้วยgrepถ้าจำนวนการเกิดขึ้นของIDได้รับการแก้ไข หากเป็นตัวแปรคุณจะต้องมีประสิทธิภาพมากกว่าเช่นสคริปต์ทุบตีหรือ Perl

หากจำนวนการเกิดขึ้นของ ID ได้รับการแก้ไข (พูด 3) จากนั้นคำสั่งดังต่อไปนี้

  grep -B 1 -A 3 SU0000 filename.txt

จะทำสิ่งที่คุณต้องการ

แก้ไข:

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

  #!/bin/bash

  I_INSIDE=0
  PREVIOUS_LINE=""

  while read line; do
    echo $line | grep -e SU0000 2>&1 1>/dev/null
    if [ $? == 0 ]; then
            echo $PREVIOUS_LINE
            echo $line
            I_INSIDE=1
            PREVIOUS_LINE=$line
            continue
    fi
    echo $line | grep -e ID 2>&1 1>/dev/null
    if [ $? == 0 -a $I_INSIDE == 1 ]; then
            echo $line
    else
            I_INSIDE=0
    fi
    PREVIOUS_LINE=$line

  done < data

มันเป็นสคริปต์ระดับต้น ๆ ที่อนุญาตให้คุณทำตามทุกคำสั่ง มันอาจถูกย่อให้แน่น


ขอบคุณ Marius ฉันรู้ถึงคำสั่ง grep ที่คุณพูดถึง น่าเสียดายที่การเกิด 'ID' ไม่ได้รับการแก้ไข คุณสามารถแสดงสคริปต์ bash / perl ให้ฉันดูได้ไหม
vinay

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