多列上的 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()。
我正在尝试使用 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()。