2015-06-16 55 views
0

我有一個分號分隔的CSV文件看起來像這樣:如何匹配和更改分號分隔文件列中的字符串?

column1;column2;;123564;128;;IJL;value;;;;;3705;;;;;;;; 
column1;column2;;26789786413423;;CCE;value value;;;;;;3705;;;;;;;; 
column1;column2;;4564564;128;;SSE;value;;;;;;;;;;;;; 
column1;column2;;4645646;128;;JJY;someting X;;;;;;;;;;;;; 
column1;column2;;123132;128;;ASA;X value;;;;;;;;;;;;; 
column1;column2;;45643123;128;;TT;9 someting;;;;;;;;;;;;; 
column1;column2;;456464;128;;KK;VALUE 9 VALUE;;;;;;;;;;;;; 
column1;column2;;4646;128;;ST;value 6;;;;;;;;;;;;; 
column1;column2;;456464;128;;NX;7 something;;;;;;;;;;;;; 

我想找到的第8列一個特定的值/串,並替換成別的東西。我遇到的問題是我無法找到一個sed或awk,只有在它完全匹配時才編輯第8列。

我想才達到這樣的事情(不工作):

awk -F";" '$8=="value" {gsub(/$8/,"column 8");print;}' infile.csv >outfile.csv 

我想整列8,如果我得到的字符串「值」列8精確匹配進行編輯。所以我不希望具有「價值」或「X值」的第8列改變。

無論它是sed還是awk命令都沒關係,如果可能,我更願意直接編輯文件而不是使用輸入/輸出文件。有可能在其他列中出現匹配字符串,這就是爲什麼它也很重要我只在第8列進行搜索。

任何想法如何做到這一點?

回答

4

沒有必要與gsub一個單獨的條件 - 你可以把它應用到每個記錄,它不會做任何那些不匹配:

awk -F\; -v OFS=";" '{gsub(/value/,"column 8",$8)}1' infile.csv > outfile.csv 

這是非常重要轉義/報價;,使它不被shell解釋!另外,正如評論中所指出的(謝謝),您還需要設置輸出字段分隔符,以便awk所觸及的行保持以分號分隔。

如果需要,可以通過將模式更改爲/^value$/來將錨點添加到字段的開始和結尾處以便完全匹配。

1最後只是print的簡寫(因爲它總是如此,默認操作是打印記錄)。

1

使用sed

sed -i 's/^\(\([^;]*;\)\{7\}\)value;/\1column 8;/' file 

這捕獲在捕獲組前七場,檢查8號正好值,並將其替換爲捕獲字符串和替換文本字符串。

-i是就地

相關問題