От данного образца к ожидаемому результату, используя GNU awk (если используется FPAT
, а не FS
):
$ awk '
BEGIN {
# FS="," # no quoted fields
FPAT="([^,]*)|(\"[^\"]+\")"
}
NR==1 {
for(i=1;i<=NF;i++)
a[i]=$i
}
NR==3 {
for(i=1;i<=NF;i++) {
gsub(/^"|"$/,"",$i)
printf "CAST(%s AS %s) AS %s%s\n",a[i],$i,a[i],(i==NF?"":",")
}
exit
}' file
Выход:
CAST(Col1 AS String) AS Col1,
CAST(Col2 AS String) AS Col2,
CAST(Col3 AS Bigint) AS Col3,
CAST(Col4 AS Int) AS Col4,
CAST(Col5 AS String) AS Col5
Однострочник для вашегосантехника:
$ ... | awk 'BEGIN{FPAT="([^,]*)|(\"[^\"]+\")"}NR==1{for(i=1;i<=NF;i++)a[i]=$i}NR==3{for(i=1;i<=NF;i++){gsub(/^"|"$/,"",$i);printf "CAST(%s AS %s) AS %s%s\n",a[i],$i,a[i],(i==NF?"":",")}exit}'
Обновлен вывод с полями в кавычках:
CAST(Col1 AS String) AS Col1,
CAST(Col2 AS String) AS Col2,
CAST(Col3 AS Bigint) AS Col3,
CAST(Col4 AS Int) AS Col4,
CAST(Col5 AS String) AS Col5,
CAST(Col6 AS Decimal (35,2)) AS Col6
Обновление Версия для FPAT
меньше awks. Он имеет парсер начального уровня для работы с запятыми в (одной паре) двойных кавычек (\"
не обрабатывается правильно):
awk '
function parse(str, i,j,n,q) {
for(i=1;i<=length(str);i++) {
if(i==length(str)||(substr(str,i+1,1)=="," && q==0)) {
b[++n]=substr(str,j+1,i-j)
j=i+1
}
if(substr(str,i+1,1)=="\"")
q=(!q)
}
return n
}
BEGIN {
FS=","
}
NR==1 {
for(i=1;i<=NF;i++)
a[i]=$i
}
NR==3 {
n=parse($0)
for(i=1;i<=n;i++) {
gsub(/^"|"$/,"",b[i])
printf "CAST(%s AS %s) AS %s%s\n",a[i],b[i],a[i],(i==n?"":",")
}
exit
}' file