2012-08-02 46 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 
相关问题