特定の列が同じ文字列を持つように列の順序を並べ替えます。

特定の列が同じ文字列を持つように列の順序を並べ替えます。

列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

関連情報