2017-01-17 31 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

不能使用'這樣tee'。只要輸入文件大於「tee」使用的緩衝區大小,就會丟失輸入文件。 – hek2mgl

+1

當'2,Pavan'開始行時,你只想用'MCA'取代'tennth'?或者你爲什麼要做'/ 2,Pavan,/ s /第十/ ** MCA **/g',而不僅僅是第/十/ ** MCA **/g'? – hansaplast

+0

我想檢查的條件,如果2,帕文然後將其更改爲MCA,如果類是第十,類似的其他人,我需要驗證是否找到所需的內容,然後我需要將其更改爲所需的值 – Dileep

回答

1

優先(!)

不能使用三通這樣。只要輸入文件大於發球區使用的緩衝區大小,您將輸入文件寬鬆


關於這個話題,你的意思是這樣的嗎?

我會用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 
# 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} 

使用sed,您可以使用此選項-e

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個長的命令(看起來很可怕):

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 

並使用

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

或更好,避免了cat

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