GNU/Linux >> Belajar Linux >  >> Linux

Sisipkan Baris Baru Setelah Urutan Angka yang Rusak Awk/unix/shell Scripting?

Saya memiliki file besar untuk diproses dan saya tidak bisa mendapatkan apa yang saya butuhkan.
Harap dicatat bahwa saya tidak tahu sebelumnya berapa kali ini terjadi dalam satu file (misalnya, bisa terjadi> 1000 kali per file ).

Di bawah ini adalah file input saya (dibatasi TAB), di mana $1 adalah nomor baris. Urutan angka yang terputus terjadi pada $3:

797  47 M797    1     365.0     0.05     0.05 A 0.825
798  47 M798    1     365.0     0.05     0.05 A 0.825
799  47 M799    1     365.0     0.70     0.70 A 0.404
800  47 M800    1     365.0     0.00     0.00 A 0.990
801  47 M802    1     365.0     0.29     0.29 A 0.591
802  47 M803    1     365.0     0.12     0.12 A 0.726

Inilah yang saya inginkan:

797  47 M797    1     365.0     0.05     0.05 A 0.825
798  47 M798    1     365.0     0.05     0.05 A 0.825
799  47 M799    1     365.0     0.70     0.70 A 0.404
800  47 M800    1     365.0     0.00     0.00 A 0.990
801  
802  47 M802    1     365.0     0.29     0.29 A 0.591
803  47 M803    1     365.0     0.12     0.12 A 0.726

Ini adalah kode yang berhasil saya tulis sejauh ini (nama file adalah test.sh):

awk '
   marker=substr($3,2,6)
   { if (FNR < marker) {printf "\n"}
    }' ${1}

Ini adalah output yang saya dapatkan sejauh ini:

797       47 M797   1     365.0     0.05     0.05 A 0.825
798       47 M798   1     365.0     0.05     0.05 A 0.825
799       47 M799   1     365.0     0.70     0.70 A 0.404
800       47 M800   1     365.0     0.00     0.00 A 0.990
801       47 M802   1     365.0     0.29     0.29 A 0.591

802       47 M803    1    365.0     0.12     0.12 A 0.726

803       47 M804    1    365.0     0.08     0.08 A 0.777

Jika ada yang punya solusi yang lebih baik untuk ini, beri tahu saya.

Jawaban yang Diterima:

Anda ditandai sebagai awk , semoga Python bermanfaat.

Kode:

# !/usr/bin/python
import sys

def print_fixed_sequence(filename, line_num=0):
    with open(filename, 'rU') as f:
        for line in (x.strip() for x in f):
            _, f1, f2, data = line.split('\t', 3)
            rec_num = int(f2[1:])
            while line_num != rec_num:
                print(line_num)
                line_num += 1
            print('\t'.join((str(line_num), f1, f2, data)))
            line_num += 1

print_fixed_sequence(sys.argv[1], line_num=795)

Hasil:

795
796
797 47  M797    1   365.0   0.05    0.05    A   0.825
798 47  M798    1   365.0   0.05    0.05    A   0.825
799 47  M799    1   365.0   0.70    0.70    A   0.404
800 47  M800    1   365.0   0.00    0.00    A   0.990
801
802 47  M802    1   365.0   0.29    0.29    A   0.591
803 47  M803    1   365.0   0.12    0.12    A   0.726

Linux
  1. Array Di Unix Bourne Shell?

  2. Deskriptor File &Skrip Shell?

  3. Sistem Rusak Setelah Chmod -r 644 /?

  1. Tambahkan kolom angka di shell Unix

  2. Menambahkan karakter baris baru ke variabel shell unix

  3. sed - menyisipkan baris setelah baris X setelah pertandingan

  1. Masukkan beberapa baris data ke file setelah pola cocok menggunakan skrip shell Linux

  2. Menggunakan Tombol Vi Untuk Mengedit Perintah Shell Di Unix?

  3. Apa itu penggunaan () dalam skrip shell?