try
awk 'FNR == NR { print ; next ; }
NR > FNR && FNR > 1 {
split($0,A) ;
printf ",%s,,,,%s,,,\n",A[1],A[2] ; }' f1 f2
(можно в одну строку, я разбиваю, чтобы было удобнее читать)
where
FNR == NR { print ; next ; }
копируем строки из первого файлаNR > FNR && FNR > 1
выбираем строку из второго файла без заголовкаsplit($0,A) ;
поместить два var в массив (A
)printf ",%s,,,,%s,,,\n",A[1],A[2] ;
и printпроверено с f1
a1,a2,a3,a4,a5,a6,a7,a8,a9
q,w,,,,y,u,,
a,z,,,,q,n,,
.........................
z,p,,,,w,e,,
и f2
b1 b2
f t
a p
m n
m y
t o
run :
awk 'FNR == NR { print ; next ; } NR > FNR && FNR> 1 { split($0,A) ; printf ",%s,,,,%s,,,\n",A[1],A[2] ; }' f1 f2
result:
a1,a2,a3,a4,a5,a6,a7,a8,a9
q,w,,,,y,u,,
a,z,,,,q,n,,
.........................
z,p,,,,w,e,,
,f,,,,t,,,
,a,,,,p,,,
,m,,,,n,,,
,m,,,,y,,,
,t,,,,o,,,
En general, se recomendaría un analizador CSV adecuado. En este caso simple, awk hará :usar comillas dobles como el carácter separador de campo, y:
awk -F '"' -v OFS='"' '{
for (i=2; i<=NF; i+=2)
gsub(/[[:blank:]]/, "_", $i)
print
}' <<END
first "UDP netprobe" hello
second "ACL allow" friendly "oops, another quoted field"
third "ACL deny" world
END
first "UDP_netprobe" hello
second "ACL_allow" friendly "oops,_another_quoted_field"
third "ACL_deny" world
Para los ventiladores de línea -:
awk -F\" '{for(i=2;i<=NF;i+=2)gsub(/[[:blank:]]/,"_",$i)}1' OFS=\" file
Usandosed
:
sed 's/\("[^"]\+\) \([^"]\+"\)/\1_\2/g' file
La expresión regular busca la palabra dentro del doble, y el comando reemplaza el espacio con un guión bajo.
sed 's/\(\"[^" ]*\) \([^"]*\"\)/\1_\2/g' file
Advertencia :solo funciona con un espacio simple entre un par de comillas dobles.