パターンを検索し、最初のパターン発生でレコードを更新します。

パターンを検索し、最初のパターン発生でレコードを更新します。

識別子を含むレコードを含むファイルがあります。各識別子に複数のレコードがある可能性があります。同じ識別子を持つすべてのレコードを検索し、そのレコード内の特定のパターン(特定の場所のY)を見つけたいです。パターンがある場合は、このメトリックの最初のレコードをそのパターンに更新したいと思います。スクリプトでこれを最良に達成するにはどうすればよいですか? (UnixまたはWindows)。ファイルは識別子でソートされます。
以下は、私が達成したい仕事の例です。

identifier1aaaNbbb  
identifier1cccNddd  
identifier1eeeYfff

識別子1のレコードの1つの位置14に「Y」がある場合、その「Y」は識別子1のレコードの最初の項目に書き込まれます。

identifier1aaaYbbb  
identifier1cccNddd  
identifier1eeeYfff

awkどのツール(、、、grepsedがこの作業に最適なのかわかりません。問題を解決する方法をご存知ですか?

ベストアンサー1

入力ファイルを2回使用しawkて読み込み処理します。

Yこれはあなたの識別子の長さが11文字で、行の15番目の文字を探していると仮定します(あなたの例のように)。識別子の長さが常に11文字でない場合は、スクリプトの最初の行を変更する必要があります。

最初のパス:各識別子の最初のレコードを配列に保存し、Yレコードが見つかったらこの配列要素を変更します。

2番目のステップ:各識別子の最初のレコード行を保存され、変更された配列値に置き換えて、その行を印刷します。

awk '{
  ident=substr($0,0,11)  # get identifier
  if (NR==FNR){          # first pass
    if (!(ident in a)){  # if identifier is not present in array
      a[ident]=$0        # save current line in array
    }
    if (substr($0,15,1) == "Y"){  # if `Y` is found in current line
                                  # replace character with `Y` in array value
      a[ident]=substr(a[ident],0,14)"Y"substr(a[ident],16)
    }
  }
  else {               # second pass
    if (ident in a){   # if identifier is present in array
      $0=a[ident]      # replace current line
      delete a[ident]  # delete array element
    }
    print              # print current line
  }
}' file file

おすすめ記事