列2にPiebaldという文字列を含めたいと思います。他の文字列の順序は重要ではありません。私は持っています:
HR0024 Black pastel Piebald
HR0028 Piebald
MC0023 Piebald
MC0039 Fire Piebald
MC0075 Piebald VPI Axanthic
MC0082 Pastel Piebald
MC0120 Piebald Yellowbelly Het-Lavender
MC0124 Super-Pastel Piebald Het-Clown
MC0126 Fire Pastel Piebald
MC0144 Piebald Vanilla
私は次のようなものが欲しい:
HR0024 Piebald pastel Black
HR0028 Piebald
MC0023 Piebald
MC0039 Piebald Fire
MC0075 Piebald VPI Axanthic
MC0082 Piebald Pastel
MC0120 Piebald Yellowbelly Het-Lavender
MC0124 Piebald Super-Pastel Het-Clown
MC0126 Piebald Pastel Fire
MC0144 Piebald Vanilla
一部の行には、他の列(2、3、または4)にターゲット文字列があります。私はcut -f
これがここではうまくいかないと思います。私はそれが必要でawk
はないと思います。sed
助けてくれてありがとう。
答え1
awkを使用してフィールドを繰り返し、選択したフィールドが見つかった場合は2番目のフィールドに置き換えます。
awk -v p="Piebald" '{
for (i=2;i<=NF;i++) if ($i == p) {$i = $2; $2 = p; break}
}1' file
1
最後の意味はprint
ラインです。break
交換後、ループを早く終了します。-v var="value"
変数をに渡す標準的な方法ですawk
。- また、この方法を使用すると、入力の連続するスペースをデフォルトの出力フィールド区切り文字である単一のスペースに減らします。
出力:
HR0024 Piebald pastel Black
HR0028 Piebald
MC0023 Piebald
MC0039 Piebald Fire
MC0075 Piebald VPI Axanthic
MC0082 Piebald Pastel
MC0120 Piebald Yellowbelly Het. lavender
答え2
他の文字列の順序が重要でない場合は、次のようにできます。
$ sed -E 's/Piebald//g; s/^(\S+)/\1 Piebald/' file
HR0024 Piebald Black pastel
HR0028 Piebald
MC0023 Piebald
MC0039 Piebald Fire
MC0075 Piebald VPI Axanthic
MC0082 Piebald Pastel
MC0120 Piebald Yellowbelly Het-Lavender
MC0124 Piebald Super-Pastel Het-Clown
MC0126 Piebald Fire Pastel
MC0144 Piebald Vanilla
またはsed
サポートしていない場合:
$ perl -pe 's/Piebald//g; s/^(\S+)/\1 Piebald/' file
HR0024 Piebald Black pastel
HR0028 Piebald
MC0023 Piebald
MC0039 Piebald Fire
MC0075 Piebald VPI Axanthic
MC0082 Piebald Pastel
MC0120 Piebald Yellowbelly Het-Lavender
MC0124 Piebald Super-Pastel Het-Clown
MC0126 Piebald Fire Pastel
MC0144 Piebald Vanilla