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

Perl 将字符串/数字插入csv文件的特定单元格,perl,bash,csv,sed,awk,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

基本上现在我有一个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
这将打印第二行和第二列中的单元格。我需要类似的东西,除了它可以输入一个值到一个特定的单元格,而不是读取它。有这样的功能吗?

您可以使用以下功能:

awk -v value=$value -v row=$row -v col=$col 'BEGIN{FS=OFS="@"} NR==row {$col=value}1' file
并设置bash值
$value
$row
$col
。然后可以重定向并移动到原始位置:

啊。。。文件>新建文件(&mv)新建文件

这意味着只要第一个命令(
awk…
)成功执行,第二个命令就会执行

解释
  • -v value=$value-v row=$row-v col=$col
    将bash变量传递给
    awk
    。注意
    value
    row
    col
    可以是其他名称,我只是使用了与bash相同的名称,以便更容易理解
  • BEGIN{FS=OFS=“@”}
    将字段分隔符和输出字段分隔符设置为
    @
    。这里不需要使用
    OFS=“@”
    ,但在您执行一些
    打印时可能会很有用
  • NR==行{$col=value}
    当记录数(此处的行数)等于
    row
    时,然后使用
    value
    值设置
    col
  • 1
    执行默认的
    awk
    操作:
    {print$0}
例子
您可以使用以下选项:

awk -v value=$value -v row=$row -v col=$col 'BEGIN{FS=OFS="@"} NR==row {$col=value}1' file
并设置bash值
$value
$row
$col
。然后可以重定向并移动到原始位置:

啊。。。文件>新建文件(&mv)新建文件

这意味着只要第一个命令(
awk…
)成功执行,第二个命令就会执行

解释
  • -v value=$value-v row=$row-v col=$col
    将bash变量传递给
    awk
    。注意
    value
    row
    col
    可以是其他名称,我只是使用了与bash相同的名称,以便更容易理解
  • BEGIN{FS=OFS=“@”}
    将字段分隔符和输出字段分隔符设置为
    @
    。这里不需要使用
    OFS=“@”
    ,但在您执行一些
    打印时可能会很有用
  • NR==行{$col=value}
    当记录数(此处的行数)等于
    row
    时,然后使用
    value
    值设置
    col
  • 1
    执行默认的
    awk
    操作:
    {print$0}
例子
您的问题有一个“perl”标记,因此这里有一种使用它的方法,它允许您将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;

您的问题有一个“perl”标记,因此这里有一种使用它的方法,它允许您将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
使用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

如何使用这个AWK和输出到另一个文件?我想这会花太长时间…我正在使用CSV文件,大约有1000个条目……每当我觉得有点忙乱时重新创建文件…再加上这个文件将不断更新,你也可以考虑使用<代码> SED/I代码>代码。如果您粘贴一些示例输入,我们可以提供一些解决方案。它是用逗号分隔还是用
@
分隔?它用一个@分隔。我一直在玩awk…到目前为止,我想到的是:
awk-F,{$(NF+1)=hi;}1'OFS=@test.csv>output.csv
但是这只是用“hi”替换了最后一列,不知何故,我需要指定行。首先获得所有要更改的值,然后在一次传递中执行所有文件更新可能是有意义的。否则您将多次打开并读取该文件,使用这个AWK和输出到另一个文件会怎么样?我想这会花太长时间…我正在使用CSV文件,大约有1000个条目……每当我觉得有点忙乱时就重新创建文件…再加上这个文件将不断更新,你也可以考虑使用<代码> SED。-为此,我
。如果您粘贴一些示例输入,我们可以提供一些解决方案。它是用逗号分隔还是用
@
分隔?它用一个@分隔。我一直在玩awk…到目前为止,我想到的是:
awk-F,{$(NF+1)=hi;}1'OFS=@test.csv>output.csv
但是这只是用“hi”替换了最后一列,不知何故,我需要指定行。首先获得所有要更改的值,然后在一次传递中执行所有文件更新可能是有意义的。否则,您将多次打开和阅读该文件,这可能会或不会对您的用例产生影响。先生,您真是太棒了!我已经研究这个问题很久了。谢谢你的意见!如果你不介意我问一下BEGIN{FS=OFS=…}的目的是什么的话,通常我只见过一个或另一个被使用过,但不是同时使用的,先生,你真了不起!我已经研究这个问题很久了。谢谢你的意见!如果你不介意的话,我想问一下什么是pu