GNU/Linux >> Znalost Linux >  >> Linux

Vložit nový řádek po přerušené sekvenci čísel Skriptování Awk/unix/shell?

Musím zpracovat velký soubor a nepodařilo se mi získat přesně to, co potřebuji.
Vezměte prosím na vědomí, že předem nevím, kolikrát se to stane v jednom souboru (např. u souboru se to může stát> 1000krát ).

Níže je můj vstupní soubor (oddělený TAB), kde $1 je číslo řádku. Přerušená sekvence čísel se vyskytuje u $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
 

Tohle chci:

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
 

Toto je kód, který se mi zatím podařilo napsat (název souboru je test.sh):

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

Toto je výstup, který jsem zatím dostal:

 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
 

Pokud má někdo lepší řešení, dejte mi prosím vědět.

Přijatá odpověď:

Jste označeni jako awk , doufejme, že Python bude užitečný.

Kód:

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

Výsledky:

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. Vložte více řádků dat do souboru po shodě vzorů pomocí skriptu prostředí Linux

  2. Deskriptory souborů a skriptování prostředí?

  3. Rozbitý systém po Chmod -r 644 /?

  1. Pole v Unix Bourne Shell?

  2. Použití kláves Vi k úpravě příkazů Shell v Unixu?

  3. Mám používat skriptování Apt nebo Apt-get In Shell?

  1. Jak analyzovat Json pomocí skriptování Shell v Linuxu?

  2. Příkaz blokuje mechanismus ve skriptování Shell?

  3. Jak porovnávat řetězce ve skriptování Bash Shell