多列上的 Unix AWK,内部有空格

Unix AWK on multiple column with spaces inside

我正在尝试使用 AWK 输出到 csv 文件。原始数据是通过另一个函数"ucat function1 col1 col2 col3"得到的。我正在尝试使用 AWK 将此数据输出到 CSV。

来自“ucat function1 name pets vehicle”的输出:

name=John Doe pets=Has a dog,fish vehicle=Owns a truck,a van
name=Mary Moe pets=Has a cat vehicle=Owns a car, a jeep

我的完整命令:

ucat function1 name pets vehicle | awk '{print ","","}' > /tmp/test.csv

我得到的:

Col1    Col2    Col3
John    Has fish
Mary    Has Owns

我的预期输出:

Col1    Col2    Col3
John Doe    Has a dog,fish  Owns a truck,a van
Mary Moe    Has a cat   Owns a car, a jeep

假设我们有一个输入文件 test.txt,其内容为:

name=John Doe pets=Has a dog,fish vehicle=Owns a truck,a van
name=Mary Moe pets=Has a cat vehicle=Owns a car, a jeep

使用 AWK 将此数据输出到 CSV - 我们将应用以下 awk 方法:

cat input.txt | awk -F'=' -v OFS='\t' '{gsub(/ [^[:blank:]]*=/,"=&");print "2""2","2""2","2""2"}' > /tmp/test.csv

现在,test.csv 包含:

"John Doe"  "Has a dog, fish"   "Owns a truck,a van"
"Mary Moe"  "Has a cat" "Owns a car, a jeep"

gsub(/ [^[:blank:]]*=/,"=&") - 在每个键前添加 = 符号(例如 pets= 替换为 = pets=)以获得合适的 key/value 对进一步拆分

-F'=' - 字段分隔符

-v OFS='\t' - 设置输出字段分隔符

print "2""2","2""2","2""2" - 按顺序打印每个列值

如果您想要 CSV 输出,那么您必须用双引号将您的字段括起来,因为它们可以包含逗号:

$ cat tst.awk
{
    out = ""
    while ( match([=10=],/\s*(\S+)=([^=]+)$/,a) ) {
        out = "\"" a[2] "\"" (out == "" ? "" : "," out)
        [=10=] = substr([=10=],1,RSTART-1)
    }
    print out
}

$ awk -f tst.awk file
"John Doe","Has a dog,fish","Owns a truck,a van"
"Mary Moe","Has a cat","Owns a car, a jeep"

以上使用 GNU awk 来匹配第三个参数。对于其他 awk,您将在 match() 的结果上使用 sub() 和 split()。