Comenzando con lo básico, tengo un archivo que tiene un número, uno o más espacios y luego un nombre de archivo (incluida la ruta). El nombre del archivo y la ruta también pueden contener espacios.
Quiero usarlo awk
para separar y usar los componentes en pruebas adicionales de igualdad entre esos campos en archivos separados.
Tratando sólo del primer problema, este es el archivo:
111 aaa/aaa
222 b b/bbb
333 ccc/c c
444 d d/d d
Me gustaría ver como resultado:
aaa/aaa 111
b b/bbb 222
ccc/c c 222
d d/d d 222
La esencia aquí no es el formato de la salida anterior sino más bien poder usar $1
y $2
más $3
en la awk
expresión después de que se hayan establecido estas variables. Aunque aquí es solo un archivo, en realidad estoy comparando dos conjuntos de archivos, pero primero necesito entender este componente.
$1
debe contener la secuencia alfanumérica al inicio de la línea,
$2
debe contener la ruta completa (sin el nombre del archivo) y
$3
debe contener solo el nombre del archivo.
Intenté cambiar FS
durante el programa, pero simplemente no me sucede:
$ awk 'BEGIN{OFS=" || "}{FS=" ";a[$1]=1;FS="/";b[$NF]=1;print $1, $2, $NF}' file1
111 || dir1/a || aa
222 dir1 || bbb || bbb
333 dir1 || c cc || c cc
444 dir1 || ddd || ddd
555 dir2 || e ee || e ee
666 dir2 || fff || fff
999 dir2 || zzz || zzz
No solo se FS
elimina la barra, sino que la primera variable es simplemente incorrecta porque solo se usa la segunda.FS
Respuesta1
Realmente no entiendo por qué necesita hacer esto, pero podría (por ejemplo) guardar y eliminar el espacio delimitado sin ambigüedades $1
y luego dividir el resto usando el delimitador alternativo. Por ejemplo:
$ awk '
{
a=$1; $1=""; sub(/^ */,"");
n=split($0,p,"/");
$1=a; for(i=1;i<=n;i++) $(i+1) = p[i]
} {
print $2"/"$3, $1
}' file
aaa/aaa 111
b b/bbb 222
ccc/c c 333
d d/d d 444
Respuesta2
while read -r f1 fpath; do
printf '%s\t%s\n' "$fpath" "$f1"
done < file1
No estoy seguro de lo que buscas, pero estás haciendo que esto sea mucho más complejo de lo necesario.
Resultado:
aaa/aaa 111
b b/bbb 222
ccc/c c 333
d d/d d 444