2012-08-02 47 views
2

對不起,一個非常基本的問題。如何替換選項卡中的某個列,用一些字符串將文件分隔開,如「xyz」?如何用一些字符串替換CSV中的特定列?

例如

輸入:

abc\t def\t \t xyz 
pqr\t ert\t \t yut 

輸出:

abc\t def\t new_str\t xyz 
pqr\t ert\t new_str\t yut 

總之,在我的文件中的第三列是空的,我想用一個字符串來取代它。

我綁是這樣的:

awk '{$3="new_str"}1' test1.csv > test1_op.csv 

,但看起來不維護選項卡。還要注意,該文件有400列,所以編寫awk命令是這樣的:

awk -F, '{OFS=",";print $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,...,$400}' in.csv > outfile.csv 

我想避免。

謝謝。

回答

5

由於它是製表符分隔的,因此您通過在選項卡上進行分割而不是awk在任何空格(空格,製表符以及其他更深奧的類型的任意組合)上進行分割的默認方式來進入正確的軌道。一旦你完成了,你可以直接分配到你想要更改的列,並再次打印$ 0。

awk -F$'\t' 'BEGIN {OFS="\t"} {$3="new_str"; print}' in.csv > outfile.csv 

awk也可以處理出現在它的輸入文件列表中的變量賦值,所以這是一個少許清潔劑的前瞻性:

awk '{$3="new_str"; print}' FS=$'\t' OFS=$'\t' in.csv > outfile.csv 
1

目前尚不清楚你到底要如何處理的空白,但也許你只是想:

awk '{$3="new_str"}1' FS=\\t OFS=\\t 

注意,這丟棄最初在$3空白。你可以用兩種留着,根據您的需求

awk '{$3=$3"new_str"}1' FS=\\t OFS=\\t 

awk '{$3=" new_str"}1' FS=\\t OFS=\\t 

2

這可能會爲你工作(GUN SED):

sed -i 's/\t/new_str&/3' file 
相關問題