使用awk在CSV文件中添加列

Rau*_*auf 5 command-line awk text-processing

我需要使用 awk 从数组中在 CSV 文件中添加一列。

例如,

input.csv

a,10
b,11
Run Code Online (Sandbox Code Playgroud)

array = (100 200)

output.csv 应该看起来像

a,10,100
b,11,200
Run Code Online (Sandbox Code Playgroud)

我试过这个命令但它不起作用

awk -F"," 'BEGIN { OFS = "," } {for (x in array) $3=array[x]; print}' input.csv> output.csv
Run Code Online (Sandbox Code Playgroud)

Dig*_*uma 6

您必须为此使用awk吗?该paste实用程序正是为这种事情而设计的。假设array是一个shell数组:

array=(100 200)
printf "%s\n" "${array[@]}" | paste -d, input.csv - > output.csv
Run Code Online (Sandbox Code Playgroud)

printf只是将每个数组成员放在一个新行上。 paste然后将 input.csv 中的输入行和-(即来自 的管道输出printf)粘贴在一起,使用逗号作为分隔符。


如果您的数组恰好是换行符分隔的文件,例如 array.txt:

100
200
Run Code Online (Sandbox Code Playgroud)

那么就更容易了:

paste -d, input.csv array.txt > output.csv
Run Code Online (Sandbox Code Playgroud)


jim*_*mij 0

问题是 shell 变量(包括数组)在awk. 您需要通过-v选项显式传递它们。此外,您不能传递整个数组,但您可以将数组放入单个变量中并将其拆分在内部awk

awk -va="$(echo "${array[@]}")" 'BEGIN{OFS=FS=","; split(a,b," ")}{print $0,b[NR]}' input.csv
Run Code Online (Sandbox Code Playgroud)

只要数组元素内没有空格,这就会起作用。