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
これに関連する質問をたくさん考えました。
- 割り当ての代わりに同等比較を使用して
chr
プレフィックスを追加しようとしています。 - 割り当てるべき内容を括弧内に入れました。
}
最初の後には関係のない内容があります。print $0
else
このセクションの前にはセミコロンを含めないでください。}
コードを入力した後、最終締切を見逃しました。
これは変更されたバージョンであり、まだ拡張されています。
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
答え2
この行を使用すると正常に動作するようです。
awk '!($1 ~ /rs/ || /chr/) {$1="chr"$1}1'