2

对不起一个非常基本的问题。如何用一些字符串替换制表符分隔文件中的特定列,比如“xyz”?

例如

输入:

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

我想避免。

谢谢。

4

3 回答 3

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
于 2012-08-02T19:46:02.057 回答
2

这可能对你有用(GUN sed):

sed -i 's/\t/new_str&/3' file
于 2012-08-02T19:46:23.330 回答
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

取决于你的需要。

于 2012-08-02T19:28:03.810 回答