Memfilter data dengan sed

0

Saya butuh bantuan. Saya punya file seperti

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

Saya ingin memfilter teks sehingga hasilnya

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

Dengan kata lain, saya ingin mendapatkan garis sebelum pola dan semua garis setelah itu dimulai dengan ID

Saya ingin melakukan ini di sed. Adakah yang bisa membantu?

vinay
sumber
Apa milikmu pattern sini? Anda mengatakan bahwa Anda perlu garis sebelum pola diikuti oleh semua garis yang dimulai dengan ID, tetapi sampel Anda habis sometext line 6 Bisakah Anda menjelaskannya?
clement
Hai Clement Terima kasih telah membalas. Polanya adalah 'SU'. Saya mencoba mengekstrak satu baris di atas pola ini dan semua baris berikut yang dimulai dengan ID. Kemudian ulangi proses ini untuk file besar yang berisi data tersebut. Apakah Anda memahaminya?
vinay
Silakan lihat edit saya
MariusMatutiae

Jawaban:

3

Kamu tidak bisa. Bukan itu yang terjadi sed dirancang untuk dilakukan.

Anda bisa melakukannya dengan grep , jika jumlah kemunculan ID telah diperbaiki. Jika bukan itu variabel, Anda akan membutuhkan sesuatu yang lebih kuat, seperti skrip bash atau perl.

Jika jumlah kemunculan ID diperbaiki (katakanlah, 3), maka perintah berikut

  grep -B 1 -A 3 SU0000 filename.txt

akan melakukan apa yang Anda butuhkan.

EDIT:

jika jumlah kemunculan SU0000 tidak diperbaiki, skrip berikut akan melakukan trik untuk Anda, di mana file yang akan diuraikan disebut "data". Ubah sesuai keinginan Anda.

  #!/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

Ini adalah skrip yang sangat dasar, untuk memungkinkan Anda mengikuti setiap instruksi. itu bisa sangat kental.

MariusMatutiae
sumber
Marius terima kasih. Saya mengetahui perintah grep yang Anda sebutkan. Sayangnya kejadian 'ID' tidak diperbaiki. Bisakah Anda menunjukkan kepada saya skrip bash / perl yang dapat melakukan ini.
vinay
Terima kasih banyak, Marius. Saya akan memeriksa ini dan akan memberi tahu Anda.
vinay