2017-01-17 20 views
0

要件ごとに処理する必要がある複数の行の列を持つファイルがあります。私は、変数でこれを行うスクリプトを見つけましたが、これは私のコードはより複雑になりますように私は、変数でこれを行う必要はありません複数の条件でファイルを編集するsedコマンド

ファイル:

Id,Name,class,Section 
1,Dileep,MBA,B 
2,Pavan,tenth,C 
3,Girish,graduate,D 

私の出力ファイルは次のようにする必要があります -

ファイル:

Id,Name,Class,Section 
1,Dileep,MBA,B 
2,Pavan,MCA,C 
3,Girish,MBA,D 

私はこれを行うにはsedコマンドを使用して、以下の私は、このために作成したスクリプトでてきました。

#! /bin/sh 
file=/tmp/dileep/details.txt 

cat $file | sed '/Id,Name,/s/class/**C**lass/g' | tee -a $file 
cat $file | sed '/2,Pavan,/s/tenth/**MCA**/g' | tee -a $file 
cat $file | sed '/3,Girish,/s/graduate/**MBA**/g' | tee -a $file 

私は最初の行を取得することができていますが、ヘッダと1を変更しましたが、実際のデータは、これはハードコーディングされたデータになるだろうと私はこの変更を行うことができません。

私が間違っていることを教えてください。どうすればこの問題を解決できますか?

+1

を避け、

cat $file | sed -f /tmp/dileep/commands.sed | tee -a ${output} 

以上を使用します。入力ファイルが 'tee'によって使用されたバッファーサイズより大きいとすぐに入力ファイルが失われます。 – hek2mgl

+1

行が '2、Pavan'で始まったら、' tenth'を 'MCA'で置き換えたいですか?またはなぜあなたは '/ 2、Pavan、/ s/tenth/** MCA **/g'をやっていますか?単に/ senth/** MCA **/g'だけではありませんか? – hansaplast

+0

2の場合はPavanがMCAに変更します。クラスが10番目の場合も同様です。必要なコンテンツが見つかった場合は検証してから、希望の値に変更する必要があります – Dileep

答えて

1

初(!)

あなたはこのようなTシャツを使用することはできません。入力ファイルがteeで使用されているバッファサイズより大きいとすぐにあなたの入力ファイルが失われます。


トピックについては、次のような意味ですか?

私はawkを使用します。

sanitize.awk:それは好き

BEGIN { 
    FS=OFS="," 
} 

$3=="class" { 
    $3="Class" 
} 

$3=="tenth"{ 
    $3="MCA" 
} 

$3=="graduate" { 
    $3="MBA" 
} 

{ 
    print 
} 

が実行:

awk -f sanitize.awk input.file > output.file 
mv output.file > input.file 
+0

私の答えを紹介し、OPで使用される実際の条件を使用するために少し即興。それらの条件を追加することができれば、削除してもよろしいでしょうか。 – Inian

+0

私は、これらの小切手はOPが望んでいない*ものであると感じています。さもなければ、質問は私には意味がない。 – hek2mgl

+0

ええ、私は確信が持てませんでした。しかし、「sed」で彼の意図は、私にそのような論理を提供するよう促した。 – Inian

0

あなたはさまざまな方法でsedを使用することができます。

file=/tmp/dileep/details.txt 
output=/tmp/dileep/details.out 
# No spaces after the last '\' of the line! 
cat $file | sed -e '/Id,Name,/s/class/**C**lass/g' \ 
       -e '/2,Pavan,/s/tenth/**MCA**/g' \ 
       -e '/3,Girish,/s/graduate/**MBA**/g' | tee -a ${output} 

それとも、1つの長いコマンドを使用することができます(ひどい見えます):私が最初にこのオプション-eを使用することができますsedので

file=/tmp/dileep/details.txt 
output=/tmp/dileep/details.out 
# Off-topic: cat $file | sed '...' can be replaced by sed '...' $file 
cat $file | sed '/Id,Name,/s/class/**C**lass/g' | 
      sed '/2,Pavan,/s/tenth/**MCA**/g' | 
      sed '/3,Girish,/s/graduate/**MBA**/g' | tee -a ${output} 

をあなたのスクリプトを修正します

cat $file | sed -e \ 
    '/Id,Name,/s/class/**C**lass/g;/2,Pavan,/s/tenth/**MCA**/g;/3,Girish,/s/graduate/**MBA**/g' | tee -a ${output} 

何ここにコマンドファイルが必要です:

cat /tmp/dileep/commands.sed 
/Id,Name,/s/class/**C**lass/g 
/2,Pavan,/s/tenth/**MCA**/g 
/3,Girish,/s/graduate/**MBA**/g 

そして、あなたがこのような `tee`を使用することはできませんcat

sed -f /tmp/dileep/commands.sed ${file} | tee -a ${output} 
関連する問題