将字符串/数字插入csv文件的特定单元格

时间:2014-01-28 22:58:42

标签: perl bash csv sed awk

现在基本上我有一个运行一系列测试的for循环运行。测试通过后,我将结果输入到csv文件中:

for (( some statement ))
     do
         if[[ something ]]
              input this value into a specific row and column
         fi
     done

我现在无法弄清楚的是如何将特定值输入到csv文件中的特定单元格中。我知道在awk中你可以用这个命令读取一个单元格: awk -v "row=2" -F'@' 'NR == row { print $2 }' some.csv这将打印第2行和第2列中的单元格。我需要类似的东西,除了它可以输入一个特定的单元格而不是读取它。有没有这样做的功能?

3 个答案:

答案 0 :(得分:2)

您可以使用以下内容:

awk -v value=$value -v row=$row -v col=$col 'BEGIN{FS=OFS="@"} NR==row {$col=value}1' file

并设置bash值$value$row$col。然后你可以重定向并移动到原始文件:

awk ...文件> new_file&& mv new_file文件

这个&&表示只要成功执行第一个命令(awk...),就会执行第二个命令。

解释

  • -v value=$value -v row=$row -v col=$col将bash变量传递给awk。注意valuerowcol可能是其他名称,我只是使用与bash相同的内容,以便更容易理解。
  • BEGIN{FS=OFS="@"}将字段分隔符和输出字段分隔符设置为@。此处不需要OFS="@",但如果您执行print,则非常有用。
  • NR==row {$col=value}当记录数(此处的行数)等于row时,请将col列设置为value值。
  • 1执行默认的awk操作:{print $0}

实施例

$ cat a
hello@how@are@you
i@am@fine@thanks
hoho@haha@hehe

$ row=2
$ col=3
$ value="XXX"
$ awk -v value=$value -v row=$row -v col=$col 'BEGIN{FS=OFS="@"} NR==row {$col=value}1' a
hello@how@are@you
i@am@XXX@thanks
hoho@haha@hehe

答案 1 :(得分:2)

你的问题有一个'perl'标签,所以这里是一种使用Tie::Array::CSV的方法,它允许你将CSV文件视为一个数组数组并使用标准数组操作:

use strict;
use warnings;

use Tie::Array::CSV;

my $row = 2;
my $col = 3;
my $value = 'value';

my $filename = '/path/to/file.csv';
tie my @file, 'Tie::Array::CSV', $filename, sep_char => '@';
$file[$row][$col] = $value;
untie @file;

答案 2 :(得分:0)

使用sed

row=2                                        # define the row number
col=3                                        # define the column number
value="value"                                # define the value you need change.
sed "$row s/[^@]\{1,\}/$value/$col" file.csv # use shell variable in sed to find row number first, then replace any word between @, and only replace the nominate column.
# So above sed command is converted to sed "2 s/[^@]\{1,\}/value/3" file.csv

如果上面的命令没问题,并且你的sed命令支持选项-i,那么运行命令直接在file.csv中更改内容

sed -i "$row s/[^@]\{1,\}/$value/$col" file.csv

否则,您需要导出到临时文件,然后更改名称。

sed "$row s/[^@]\{1,\}/$value/$col" file.csv > temp.csv
mv temp.csv file.csv