使用管道运行文件并将结果追加为新列



我有一个包含 A、B、C 列的 CSV 文件。我有一个脚本,可以阅读 2 个句子并输出一个分数。具体来说,我需要脚本来读取 col B 和 col C 来输出分数。

例如:

A      B       C
id  string1 string2

我的脚本是这样工作的:myscript(string1, string2) = score

如何编写一行代码,只接受 B 列和 C 列,然后将所有内容输出到新文件中?

我想将输出到一个新文件中,如下所示:

A       B        C       D
id   string1   string2  score

我相信代码会像这样,但不确定正确的语法。

textfile.csv | perl myscript.pl > new_textfile.csv

请帮忙

我相信这就是你需要的

 $ awk -F "," '{print $2,",",$3;}' textfile.csv | perl myscript.pl > new_textfile.csv

用于"添加列"的标准 Unix 工具是 paste

如果您的脚本为 textfile .csv 中的每一行输入生成一行输出,则可以像这样将文件并排粘贴在一起:

perl myscript.pl > tmpfile.csv
paste -d , textfile.csv tmpfile.csv > new_textfile.csv

或者,您可以通过改用管道在一个步骤中执行此操作(省略临时文件):

perl myscript.pl | paste -d , textfile.csv - > new_textfile.csv

如果您的脚本仅对输入的第 2 列和第 3 列进行操作,并且不知道如何忽略第 1 列,则可以提取第 2 列和第 3 列以馈送到脚本中:

awk -F, '{print $2, $3}' textfile.csv | perl myscript.pl | ...

(但请注意,使用 -F, 调用的 awk 不是一个完全通用的 CSV 解析器,并且不会处理引用。

最后,如果脚本的每次调用只知道如何对一对数字进行操作(即,在textfile.csv的一行输入上),则可以使用循环,如下所示:

cp /dev/null tmpfile.csv
awk -F, '{print $2, $3}' textfile.csv | while read col2 col3
do
    perl myscript.pl $col2 $col3 >> tmpfile.csv
done
paste -d , textfile.csv tmpfile.csv > new_textfile.csv

或者你可以花哨并重定向循环的输出:

awk -F, '{print $2, $3}' textfile.csv | while read col2 col3
do
    perl myscript.pl $col2 $col3
done > tmpfile.csv
paste -d , textfile.csv tmpfile.csv > new_textfile.csv

或者,如果你真的想成为一名牛仔:

awk -F, '{print $2, $3}' textfile.csv | while read col2 col3
do
    perl myscript.pl $col2 $col3
done | paste -d , textfile.csv - > new_textfile.csv

相关内容

  • 没有找到相关文章

最新更新