Что comm и diff пытаются выполнить на уровне ввода/вывода?

Eliminar campos en awk es notoriamente difícil. Parece ser una operación tan simple (ya menudo requerida )pero es más difícil de lo que debería ser.

Consulte ¿Hay alguna manera de eliminar completamente los campos en awk, de modo que los delimitadores adicionales no se impriman? de Stack Overflow para conocer una buena forma de hacerlo.

He copiado la función rmcol()en la respuesta de @ghoti, de modo que tenemos una copia aquí en U&L:

function rmcol(col,     i) {
  for (i=col; i

Elimina la columna especificada de la línea de entrada actual y disminuye el contador de campo(NF)para que coincida.

No tengo idea de qué hace su función transform(), así que ni siquiera intentaré duplicar eso -pero aquí hay un ejemplo del uso de rmcol()en un awkuno -trazador de líneas:

$ echo 'field1,field2,field3' | awk -F, -v OFS=, '
  function rmcol(col,     i) {
    for (i=col; i

Por cierto, si necesita eliminar varios campos de una línea de entrada, lo mejor/más fácil es eliminarlos en orden inverso. Es decir, elimine primero los -campos numerados más altos . ¿Por qué? Porque los campos numerados más altos -se volverán a numerar cada vez que elimine un campo numerado más bajo -, lo que hace que sea muy difícil hacer un seguimiento de qué número de campo pertenece a qué campo.


Por cierto, delete()en awkes para eliminar elementos de una matriz -no para eliminar campos de una línea de entrada. Podría split()cada línea de entrada (enFS)en una matriz y eliminar el segundo elemento de la matriz, pero luego tendría que escribir una función join()para imprimir la matriz con una coma (oOFS)separando cada campo.

Incluso hacer eso sería más complicado de lo que cabría esperar porque todas las matrices en awkson ​​matrices asociativas (, es decir, no están indexadas numéricamente )-, por lo quedelete(array[2])no lo estará cambia automáticamente los elementos de la matriz 3+ a los elementos 2+. Tendría que escribir su propia función contenedora alrededor de delete()para hacer más o menos lo mismo con las matrices que hace rmcol()con los campos de entrada.

-3
08.11.2018, 01:09
1 ответ

Как отмечено здесь;https://en.m.wikipedia.org/wiki/Diff

"The operation of diff is based on solving the longest common subsequence problem."

и, как отмечено в комментариях, существует несколько реализаций, которые немного отличаются (diff,gdiff,vimdiff,git -diff,rdiff -backup и т. д. ). на вики-странице LCS есть математическое определение, которое вы запрашиваете. Вычтите все LCS из двух упорядоченных наборов, и остаток будет diff.

2
28.01.2020, 05:18

Теги

Похожие вопросы