awk if-then-else文エラー

awk if-then-else文エラー

awkを使用してbashスクリプトにif-then-elseステートメントを作成しています。

私が望むのは、col 1の値が特定の文字列(rsまたはchr)と一致しない行を識別し、識別された行のcol 1の値にプレフィックス(chr)を追加することです。一致する文字列を持つすべての行は、追加していないまま印刷する必要があります。

これまで私のコード行は次のようになります。

awk '{if (! ($1 ~ /rs/ || $1 ~ /chr/)) {($1 == "chr"$1); print $0}}; else {print $0}' filename > newfilename

このコードの構文エラーメッセージは引き続き表示されます。

識別と追加は自分で正常に実行できますが、それを単一のコマンドにまとめるのに問題があります。

ベストアンサー1

見やすくするために、拡張コードは次のとおりです。

awk '
    {
        if (! ($1 ~ /rs/ || $1 ~ /chr/) )
        {
            ($1 == "chr"$1);
            print $0}
        };
        else
        { print $0 }
' filename > newfilename

これに関連する質問をたくさん考えました。

  1. 割り当ての代わりに同等比較を使用してchrプレフィックスを追加しようとしています。
  2. 割り当てるべき内容を括弧内に入れました。
  3. }最初の後には関係のない内容があります。print $0
  4. elseこのセクションの前にはセミコロンを含めないでください。
  5. }コードを入力した後、最終締切を見逃しました。

これは変更されたバージョンであり、まだ拡張されています。

awk '
    {
        if (! ($1 ~ /rs/ || $1 ~ /chr/) )
        {
            $1 = "chr" $1;
            print $0
        }
        else
        { print $0 }
    }
' filename > newfilename

print $0その後、重複したコンテンツを基準から除外する簡単な最適化を確認できます。

awk '
    {
        if (! ($1 ~ /rs/ || $1 ~ /chr/) )
        {
            $1 = "chr" $1
        }
        print $0
    }
' filename > newfilename

基本的には単純な「条件→修正」なので、実際にはawk標準構造を使ってさらに簡素化できます。これには、awk入力ファイルの各行を順次処理する2つのステートメントがあります。最初の行は"chr"必要に応じてプレフィックスを追加します。 2番目は各行を印刷します。

awk '
    (! ($1 ~ /rs/ || $1 ~ /chr/) ) { $1 = "chr" $1 }
    1
' filename > newfilename

これにより、awk読みやすさが若干影響を受けても、1行にまとめることができます。

awk '(! ($1 ~ /rs|chr/) ) { $1 = "chr" $1 } 1' filename > newfilename

おすすめ記事