列に含まれるコロンの数に基づいて列の値を変更する

列に含まれるコロンの数に基づいて列の値を変更する

2 番目の列の内容を、そこに含まれるコロンの数に基づいて操作します。2 番目のフィールドに複数のコロンが含まれている場合は、最初のコロンの前の内容が必要になり、そうでない場合は値全体が必要になります。

#Input    
1 1131:11854476:4:1$ 0 114476 1 4
5 367504:11862778:4:2$ 0 118628 2 4
3 3:64357_3_2$ 0 18267 2 3 
4 7575:38680372:1$ 0 38372 1 2

# Output
1 1131 0 114476 1 4
5 367504 0 118628 2 4
3 3:64357_3_2$ 0 18267 2 3 
4 7575 0 386372 1 2

ファイル全体を操作または処理した後に1つの列をコピーするためのさまざまな提案に遭遇しました。awkただし、残りの列は未処理のままにしておく必要があります。これを単一のコマンド ( /cutワンライナー) または複数のコマンドで実現する方法についてアイデアをいただけないでしょうか。

答え1

split2 番目のフィールドをオンにし:て、2 つ以上のピース (つまり、配列内の要素の数z) を取得する場合は、最初のピースのみを保持できます。

awk '{n=split($2, z, ":");if (n > 2) $2=z[1]};1' infile

使用したい場合はsub次のようにします:

awk '{sub(/:.*:.*/,"",$2)};1' infile

つまり、2 つ以上のコロンを置き換えようとします。

関連情報