我有一个包含 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