我有一个csv文件作为临时变量存储在Shell脚本(* .sh)中。
让我们说数据看起来像这样:
Account,Symbol,Price
100,AAPL US,200
102,SPY US,500
我要添加第四列“类型”,这是外壳函数“ foobar”的结果。从命令行或Shell脚本本身运行:
$ foobar "AAPL US"
"Stock"
$ foobar "SPY US"
"ETF"
如何将此列添加到我的csv中,并使用对foobar的调用(以第二列作为参数)填充它?要澄清的是,这是我理想的结果后记:
Account,Symbol,Price,Type
100,AAPL US,200,Common Stock
102,SPY US,500,ETF
我在线上看到许多示例,这些示例涉及使用awk进行这样的列加法,并用固定值,条件值,其他列的数学推导等填充新列等,但是没有什么可以在另一个字段上调用函数并存储其输出
答案 0 :(得分:2)
您可以使用此awk
:
export -f foobar
awk 'BEGIN{FS=OFS=","} NR==1{print $0, "Type"; next} {
cmd = "foobar \"" $2 "\""; cmd | getline line; close(cmd);
print $0, line
}' file.csv
Account,Symbol,Price,Type
100,AAPL US,200,Common Stock
102,SPY US,500,ETF
答案 1 :(得分:2)
@anubhavas答案是一种很好的方法,所以请不要更改已接受的答案,因为我将其发布为答案,因为它太大且需要格式化才能放入注释中。
FWIW,我将他的awk脚本编写为:
awk '
BEGIN { FS=OFS="," }
NR==1 { type = "Type" }
NR > 1 {
cmd = "foobar \047" $2 "\047"
type = ((cmd | getline line) > 0 ? line : "ERROR")
close(cmd)
}
{ print $0, type }
' file.csv
收件人:
cmd | getline
失败,则防止静默打印先前的值,并且答案 2 :(得分:1)
awk
来营救!
$ echo "Account,Symbol,Price
100,AAPL US,200
102,SPY US,500" |
awk -F, 'NR>1{cmd="foobar "$2; cmd | getline type} {print $0 FS (NR==1?"Type":type)}'
不确定您是否需要将输入引用到foobar
答案 3 :(得分:1)
不使用awk
的另一种方法:
paste -d, input.csv <({ read; printf "Type\n"; while IFS=, read -r _ s _; do foobar "$s"; done; } < input.csv)