2017-02-03 5 views
0

セミコロンで区切られた列があり、特定の列にいくつかの文字を追加したいと思います。特定の列に値を追加するためのシェルスクリプト

aaa;111;bbb 
ccc;222;ddd 
eee;333;fff 

2番目の列には「@」を追加したいので、出力する必要があります。

aaa;@111;bbb 
ccc;@222;ddd 
eee;@333;fff 

私は

awk -F';' -OFS=';' '{ $2 = "@" $2}1' file 

を試してみましたこれは、文字を追加しますが、スペースですべてのセミコロンを削除します。

答えて

1

あなたはあなたの仕事をするsedを使用することができます。

# replaces just the first occurrence of ';', note the absence of `g` that 
# would have made it a global replacement 
sed 's/;/;@/' file > file.out 

か、場所でそれを行うには:

sed -i 's/;/;@/' file 

または、awkを使用します。

awk -F';' '{$2 = "@"$2}1' OFS=';' file 

上記のすべてコマンドは、サンプルファイルと同じ出力になります。

aaa;@111;bbb 
ccc;@222;ddd 
eee;@333;fff 
+0

OPは第二のカラムに望んでいます。ファイル全体でこれが変更されます – Inian

+0

彼は最初の ';'である2番目の列を必要とします。彼の質問では、望ましい出力を見てください。私はあなたから 'awk'ソリューションを見たいと思っています。 – codeforester

+0

はい、私の答えで3つのソリューションをすべてテストしました。何か問題は見えますか? – codeforester

1

@atb:試してみてください: 第一:

awk -F";" '{print $1 FS "@" $2 FS $3}' Input_file 

あなたINPUT_FILEだけで3つのフィールドを持っている場合にのみ、上記は動作します。

第二

:上記のコード

awk -F";" -vfield=2 '{$field="@"$field} 1' OFS=";" Input_file 

あなたは、任意のフィールド番号を入れることができますし、あなたの要求に従って、それを作ることができます。 ここではフィールドセパレータを ";"それからフィールド番号を持つフィールドを変数とする変数を取って、その値に "@"をつけて、1は条件をTRUEにし、作成とアクションを行わないために、デフォルトでは現在の行の印刷アクションが行われます。

1

変数の設定方法を誤解しただけです。 -OFS-v OFSに変更します。

awk -F';' -v OFS=';' '{ $2 = "@" $2 }1' file 

を現実に一度に同じ値にそれらの両方を設定する必要があります。

awk 'BEGIN{FS=OFS=";"} { $2 = "@" $2 }1' file 
関連する問題