GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Zeilenumbruch nach einer unterbrochenen Zahlenfolge einfügen Awk/unix/shell Scripting?

Ich habe eine riesige Datei zu verarbeiten und konnte nicht genau das bekommen, was ich brauche.
Bitte beachten Sie, dass ich im Voraus nicht weiß, wie oft dies in einer Datei vorkommt (z. B. könnte> 1000 Mal pro Datei passieren ).

Unten ist meine Eingabedatei (TAB-getrennt), wobei $1 die Zeilennummer ist. Die unterbrochene Zahlenfolge tritt bei $3:

auf
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

Das möchte ich:

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

Dies ist der Code, den ich bisher schreiben konnte (Dateiname ist test.sh):

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

Dies ist die Ausgabe, die ich bisher erhalten habe:

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

Wenn jemand eine bessere Lösung dafür hat, lass es mich bitte wissen.

Akzeptierte Antwort:

Sie sind als awk gekennzeichnet , hoffentlich wird Python nützlich sein.

Code:

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

Ergebnisse:

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. Fügen Sie nach Musterübereinstimmungen mithilfe von Linux-Shell-Skript mehrere Datenzeilen in eine Datei ein

  2. Dateideskriptoren und Shell-Scripting?

  3. Defektes System nach Chmod -r 644 /?

  4. Sollte ich Apt oder Apt-get In Shell Scripting verwenden?

  5. Addieren Sie eine Spalte mit Zahlen in der Unix-Shell

So verwenden Sie Variablen in Shell-Skripten

Shell-Scripting Teil V:Funktionen in Bash

So vergleichen Sie Zeichenfolgen in Bash Shell-Skripten

Was ist Shebang in Linux Shell Scripting?

Shell-Scripting Schritt-für-Schritt-Tutorial

AWK-Befehl unter Linux/Unix