GNU/Linux >> Linux の 問題 >  >> Linux

数列の壊れたシーケンスの後に改行を挿入するAwk/unix / shellスクリプティング?

処理するファイルが巨大で、必要なものを正確に取得できませんでした。
1つのファイルでこれが何回発生するかを事前に知らないことに注意してください(たとえば、ファイルごとに1000回以上発生する可能性があります)。 。

以下は私の入力ファイル(TAB区切り)です。ここで、$1は行番号です。壊れた数列は$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

これが私が欲しいものです:

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

これは私がこれまでに書いたコードです(ファイル名はtest.shです):

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

これは私がこれまでに得た出力です:

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

誰かがこれに対するより良い解決策を持っているなら、私に知らせてください。

承認された回答:

あなたはawkとしてタグ付けされています 、うまくいけば、Pythonが役立つでしょう。

コード:

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

結果:

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. ファイル記述子とシェルスクリプト?

  2. Chmod -r 644 /?の後に壊れたシステム

  3. Unixでシェルコマンドを編集するためにViキーを使用しますか?

  1. Linuxでシェルスクリプトを使用してJsonを解析する方法は?

  2. シェルスクリプトのステートメントブロックメカニズム?

  3. AptまたはApt-getInShell Scriptingを使用する必要がありますか?

  1. Linuxシェルスクリプトを使用してパターンが一致した後、ファイルに複数行のデータを挿入します

  2. Unix Bourne Shellの配列?

  3. Bashシェルスクリプトで文字列を比較する方法