File1.log

207.46.13.90  37556
157.55.39.51  34268
40.77.167.109 21824
157.55.39.253 19683

File2.log

207.46.13.90  62343
157.55.39.51  58451
157.55.39.200 37675
40.77.167.109 21824

A continuación se debe esperar Output.log

207.46.13.90    37556   62343
157.55.39.51    34268   58451
157.55.39.200   -----   37675
40.77.167.109   21824   21824
157.55.39.253   19683   -----

Intenté con el siguiente comando 'unirse', pero omite la línea que falta

join --nocheck-order File1.log File2.log

Salida como a continuación (no como se esperaba)

207.46.13.90  37556 62343
157.55.39.51  34268 58451
40.77.167.109 21824 21824

¿Podría alguien ayudarme con el comando adecuado para la salida deseada? Gracias por adelantado

2
user2170023 18 dic. 2019 a las 17:52

2 respuestas

La mejor respuesta

Por favor, intente seguir.

awk '
FNR==NR{
  a[$1]=$2
  next
}
($1 in a){
  print $0,a[$1]
  b[$1]
  next
}
{
  print $1,$2 " ----- "
}
END{
  for(i in a){
    if(!(i in b)){
      print i" ----- "a[i]
    }
  }
}
'  Input_file2  Input_file1

La salida será la siguiente.

207.46.13.90  37556 62343
157.55.39.51  34268 58451
40.77.167.109 21824 21824
157.55.39.253 19683 -----
157.55.39.200 ----- 37675
2
RavinderSingh13 18 dic. 2019 a las 15:09

Lo siguiente es suficiente si no le importa el orden de salida:

join -a1 -a2 -e----- -oauto <(sort file1.log) <(sort file2.log) |
column -t -s' ' -o'   '

Con recreación de los archivos de entrada:

cat <<EOF >file1.log
207.46.13.90  37556
157.55.39.51  34268
40.77.167.109 21824
157.55.39.253 19683
EOF
cat <<EOF >file2.log
207.46.13.90  62343
157.55.39.51  58451
157.55.39.200 37675
40.77.167.109 21824
EOF

Salidas:

157.55.39.200   -----   37675
157.55.39.253   19683   -----
157.55.39.51    34268   58451
207.46.13.90    37556   62343
40.77.167.109   21824   21824

join por defecto se une por las primeras columnas. El -a1 -a2 hace que imprima las líneas no coincidentes de ambas entradas. El -e----- imprime columnas desconocidas como puntos. -oauto determina la salida de las columnas de las entradas. Debido a que queremos ordenar en la primera columna, no necesitamos especificar -k1 a sort, pero sort -s -k1 podría acelerar las cosas. Para que coincida con la salida esperada, también canalé a column.

Puede ordenar la salida por puertos canalizándola, por ejemplo, a sort -rnk2,3.

1
KamilCuk 18 dic. 2019 a las 15:02