使用Shell脚本awk将函数在另一个字段上的结果附加到csv中

时间:2018-08-22 17:38:19

标签: shell csv awk sed edit

我有一个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进行这样的列加法,并用固定值,条件值,其他列的数学推导等填充新列等,但是没有什么可以在另一个字段上调用函数并存储其输出

4 个答案:

答案 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

收件人:

  1. 更好地保护$ 2不受shell扩展的影响,
  2. 如果cmd | getline失败,则防止静默打印先前的值,并且
  3. 将打印语句合并为1行,以便在必要时轻松更改所有输出行

答案 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)
相关问题