基本上,我有一个用于运行一系列测试的循环运行。测试通过后,我将结果输入到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
将在第二行和第二列中打印单元格。我需要类似的东西,除非它可以将值输入到特定的单元格中,而不是读取它。是否有一个功能?
您可以使用以下内容:
awk -v value=$value -v row=$row -v col=$col 'BEGIN{FS=OFS="@"} NR==row {$col=value}1' file
并设置BASH值$value
,$row
和$col
。然后,您可以重定向并移至原始:
awk ... file> 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
您的问题具有'perl'标签,因此这是一种使用tie :: Array :: 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;
使用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