特定のフィールドの unix txt ファイル形式

特定のフィールドの unix txt ファイル形式

file1.dat次の内容を含む区切り文字ファイル。その列の$COL各区切り文字にテキスト文字列を追加して3番目の列を変更したいと思います。#

すべての行に対してこれを行い、同じ名前でファイルを保存したいと思います。

誰でも助けることができますか?

入力サンプル

name|class|colors|age|email
abc|xyz|#orange#green#pink#blue|16|[email protected]
pqr|xyz|#orange#green#pink#blue|20|[email protected]

希望の出力

name|class|colors|age|email
abc|xyz|#orange$COL#green$COL#pink$COL#blue$COL|16|[email protected]
pqr|xyz|#orange$COL#green$COL#pink$COL#blue$COL|20|[email protected]

答え1

$COLあなたの例では、で始まる行の各文字列の末尾に追加したいと思います#。この単純なケースでは、次のように簡単に実行できます。

$ sed -E 's/(#[^#|]*)/\1$COL/g' file
name|class|colors|age|email
abc|xyz|#orange$COL#green$COL#pink$COL#blue$COL|16|[email protected]
pqr|xyz|#orange$COL#green$COL#pink$COL#blue$COL|20|[email protected]

またはsedサポートしていない場合-E

sed 's/\(#[^#|]*\)/\1$COL/g' file

-i以下を使用して、その場所でファイルを編集できます。

sed -i -E 's/(#[^#|]*)/\1$COL/g' file

より一般的な場合、区切り文字列$COLの追加を置き換えるには、#3番目の区切りフィールドでのみ|次の操作を実行できます。

$ awk -F'|' -vOFS='|' 'NR>1{gsub(/#[^#|]*/,"&$COL",$3)}1' file 
name|class|colors|age|email
abc|xyz|#orange$COL#green$COL#pink$COL#blue$COL|16|[email protected]
pqr|xyz|#orange$COL#green$COL#pink$COL#blue$COL|20|[email protected]

最新バージョンのGNUでは、以下を使用してファイルを編集awkできます。-i inplace

awk -iinplace -F'|' -vOFS='|' 'NR>1{gsub(/#[^#|]*/,"&$COL",$3)}1'

#最後に、楽しみのためにPerlを使用してすべての-defend文字列を変更することもできます。

perl -pe 's/(#[^#|]+)/$1\$COL/g' file 

または、3番目の列で次の操作を行います。

perl -F'\|' -lane '$F[2]=~s/(#[^#|]+)/$1\$COL/g; print join "|",@F' file 

または、3番目の列でこれを行い、最初の行をスキップします。

perl -F'\|' -lane '$F[2]=~s/(#[^#|]+)/$1\$COL/g if $.>1; print join "|",@F' file 

どちらの場合も、-iファイルをその場で編集できます。

関連情報