2012-11-27 90 views
2

我必須處理像這樣剪切和更換慶典

AAAAA:BB:CCC:EEEE:DDDD 
FF:III:JJJ:KK:LLL 
MMMM:NN:OOO:PP 
etc 

列組織數據的文件可以有不同的長度,但線路總是有相同的列數。

我希望能夠剪切給定行的特定列並將其更改爲我想要的值。

比如我申請我的命令和文件更改爲

AAAAA:BB:XXXX:EEEE:DDDD 
FF:III:JJJ:KK:LLL 
MMMM:NN:OOO:PP 

我知道如何選擇具有SED特定的行,然後切割場,但我對如何更換現場不知道與我擁有的價值。

感謝

+0

考慮使用[sed的](http://en.wikipedia.org/wiki/Sed)或[AWK](http://wikipedia.org/wiki/Awk) –

+0

一個簡單的'sed s/val/rep /'應該這樣做。 – squiguy

回答

6

這裏是一種與awk做到這一點:

要與你的例子,如果你想更換1號線的第3場:

awk 'BEGIN{FS=OFS=":"} {if (NR==1) {$3 = "XXXX"}; print}' input_file 

輸入:

AAAAA:BB:CCC:EEEE:DDDD 
FF:III:JJJ:KK:LLL 
MMMM:NN:OOO:PP 

輸出:

AAAAA:BB:XXXX:EEEE:DDDD 
FF:III:JJJ:KK:LLL 
MMMM:NN:OOO:PP 

說明:

  • awk:調用awk命令
  • '...':一切由單引號括起來的指令,在awk
  • BEGIN{FS=OFS=":"}:使用:作爲輸入和輸出的分隔符​​。 FS代表場分隔符。 OFS代表輸出字段分隔符。
  • if (NR==1) {$3 = "XXXX"};:如果迄今爲止讀取的記錄數(NR)爲1,則將第三個字段($3)設置爲「XXXX」。
  • print:打印當前行
  • input_file:輸入文件的名稱。

反之,如果你想做到的是簡單地XXXX取代的CCC所有出現在你的文件是什麼,簡單地做:

sed -i 's/CCC/XXXX/g` input_file 

注意,這也將取代部分匹配,例如作爲ABCCCDD - >ABXXXXDD

+0

這就是我所需要的! – ulkar

+0

非常感謝 – ulkar

+0

只有一件事,如果我使用這個命令,它會在文件中輸出修改後的版本與原始版本,如下所示: – ulkar

1

這可能爲你工作(GNU SED):

sed -r 's/^(([^:]*:?){2})CCC/\1XXXX/' file 

awk -F: -vOFS=: '$3=="CCC"{$3="XXXX"};1' file