现在基本上我有一个运行一系列测试的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列中的单元格。我需要类似的东西,除了它可以输入一个特定的单元格而不是读取它。有没有这样做的功能?
答案 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
。注意value
,row
和col
可能是其他名称,我只是使用与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