2012-02-27 14 views
0

は私がawkので遊んでいると私は、ファイルの最初の2つのフィールドを交換しようとしています右。これらは、フィールドをスワップしない2つの出力です。フィールドをスワップした後の2つ目の出力は、awkはそうのような、奇妙なバグ

x cjares 3158 115 Caleb Timothy Jares,256 Avery Hall,2-7763 /home/ugrad/cjares /bin/tcsh 
cjares:x:3158:115:Caleb Timothy Jares,256 Avery Hall,2-7763:/home/ugrad/cjares:/bin/tcsh 

すべてのセミコロンをスペースで置き換えます。

答えて

1

awkでは、デフォルトの出力フィールド区切り(OFS)はスペース ""です。あなたはそれを変更することができます:

awk -F: 'BEGIN{OFS=":"} /cjares/{temp=$1; $1=$2; $2=temp; print}' /etc/passwd 
-1

$ 1と$ 2を再割り当てすることで、$ 0の値を魔法のように変更することはありません。 ここで明示的に明示的に明示的にawkに指示する必要があります。 ":"、$ 1、 ":"、$ 3 ":" あなたは、明示的

印刷$ 2行を再生成する必要があるとしている意味

...

または使用のprintf同様の方法で。

sedがここで少しうまくいくかもしれません - 正規表現置換を使って最初の2つのフィールドを交換することができます。あるいは、subやgsub関数を使ってawkで同じことをすることもできますが、それはおそらくもっと痛いでしょう。

ところで、おそらく/ cjares /とアクションの間にスペースが必要です。

+0

最初に、私はどのようにして回線を再生成しますか? 第二に、スペースは問題か、それはちょうど正しいのでしょうか?私は1ライナーを入力していただけで、私はそれをきれいにするつもりはありませんでした。 –

+0

上記の編集を参照してください。 – Perry

+0

私はそれをawkを使って以下のように解決しました: 'awk '{printf $ 2、$ 1; for(i = 3; i

関連する問題