如何用一些字符串替换CSV中的特定列?

时间:2012-08-02 19:21:48

标签: perl bash shell sed awk

很抱歉有一个非常基本的问题。如何使用某个字符串替换制表符分隔文件中的特定列,例如“xyz”?

e.g。

输入:

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

简而言之,我文件中的第3列是空的,我想用字符串替换它。

我绑了这样的东西:

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

我想避免。

感谢。

3 个答案:

答案 0 :(得分: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 :(得分:2)

这可能适合你(GUN sed):

sed -i 's/\t/new_str&/3' file

答案 2 :(得分: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

取决于您的需求。