列2にqがある場合は列1にvalを印刷し、列2にqがない場合は列2に同じ値を印刷します。

列2にqがある場合は列1にvalを印刷し、列2にqがない場合は列2に同じ値を印刷します。
A01_106367192   A01_106367192
A01_106359962   A01_106359962
A01_106106644   A01_106106656
A01_106045906   A01_106045909
A01_105865211   A01_105865216
A01_105877866   q
B01_114451441   q
A01_105801529   A01_105801532
A01_105803107   A01_105803079
A01_105803074   A01_105803079
A01_105061789   A01_105061763
A01_105408577   A01_105408577
A01_104975080   A01_104975074
A01_104994687   A01_104994690
A01_104983310   q
A01_104542183   A01_104542186
A01_104652672   q
A01_104652685   A01_104652679
A01_105006416   A01_105006421
A01_105136838   A01_105136837
A01_104359686   q
A01_104359660   A01_104359665

awk '{if ($2 == q) print $1; else print$2 }' input_file |less

列2をそのまま返します。

答え1

あなたのコード:

awk '{if ($2 == q) print $1; else print$2 }' input_file

$1これにより、if$2などのawk変数が印刷されますq。変数が初期化されていないため、q次のように定義しないと、テストが真ではない可能性が高くなります。ひも "q"コマンドラインから:

 awk -vq="q" '{if ($2 == q) print $1; else print $2 }'

"q"おそらくあなたが望むのは、コード自体と比較することです。

awk '{if ($2 == "q") print $1; else print $2 }' input_file

または、同じ内容をより慣用的に表現するには、次のようにします。

awk '$2 == "q" { print $1 } $2 != "q" { print $2 }'

または、

awk '$2 == "q" { print $1; next } { print $2 }'

または、次のようにRomanPerekrestのソリューション表示するには、三項?:演算子を使用してください。

答え2

短いアッ方法:

awk '{ print ($2=="q"? $1:$2) }' file
  • $2=="q"? $1:$2- 三項条件の意味:式が次の$2=="qように評価された場合true- 左のオペランドを印刷し$1、そうでない場合 - 右のオペランドを印刷します。$2

出力:

A01_106367192
A01_106359962
A01_106106656
A01_106045909
A01_105865216
A01_105877866
B01_114451441
A01_105801532
A01_105803079
A01_105803079
A01_105061763
A01_105408577
A01_104975074
A01_104994690
A01_104983310
A01_104542186
A01_104652672
A01_104652679
A01_105006421
A01_105136837
A01_104359686
A01_104359665

関連情報