Как игнорировать различия между отрицательными знаками чисел в команде diff?

La ​​solución más fácil sería hacer la copia más tarde:

#!/bin/bash

# something something script stuff

[ ! -f somefile ] && exit 1

find something -type f -newer somefile -exec cp {}. ';'

Si desea que el usuario confirme cada copia, use -oken lugar de -execenfind:

find something -type f -newer somefile -ok cp {}. ';'

Primero recorrer el archivo para crear una lista de archivos para copiar, pidiéndole al usuario una entrada para cada archivo, y luego realizar la copia:

copy_these=$(mktemp)

find something -type newer somefile \
    -exec bash -c '
        read -p "Copy $0? [y/n/q]: "
        case "$REPLY" in
            [yY]*) printf "%s\n" "$0" ;;
            [qQ]*) exit 1 ;;
        esac' {} ';' >"$copy_these"

# do other stuff

# then copy the files

xargs cp -t. <"$copy_these"

rm -f "$copy_these"

Tenga en cuenta que esto supone que todos los nombres de archivo se comportan bien (sin saltos de línea ), y que se utiliza GNU cp.

1
04.10.2018, 17:34
3 ответа

Учитывая, что ваша оболочка предоставила «замену процесса» (любит последние bashes ), попробуйте

diff <(tr '-' ' ' <file1) <(tr '-' ' '<file2)
1,2c1,2
< 21    0.0081318   0.0000000   0.0000000   0.0000000   0.0138079
< 22    0.0000000   0.0000000   0.0000000   0.1156119   0.0000000
---
> 21    0.0081318   0.0000000   0.0000000   0.0000000   0.0032533
> 22    0.0000000   0.0000000   0.0000000   0.0250637   0.0000000
3
28.04.2021, 23:41
$ xdiff(){ diff -bu <($1 "$2") <($1 "$3"); }
$ xdiff 'sed s/-\([.0-9]\)/\1/g' file1 file2

вы можете выполнить другую нормализацию данных. например, рассматривать все 0.01, .01, -.0100, -.01eкак одно и то же:

$ norm(){ awk '{for(i=1;i<=NF;i++){$i=$i<0?-$i:+$i};print}' "$@"; }
$ xdiff norm file1 file2
1
28.04.2021, 23:41

Чтобы напечатать строки из файла2, соответствующие абсолютные значения которых отличаются от соответствующих полей той же строки в файле1, сохраните строки из файла1 в памяти, сравните их абсолютные значения:

function abs(x) {
  return x < 0 ? -x : x;
}

# file 1
NR == FNR {
  file1[$1]=$2" "$3" "$4" "$5" "$6
}

# file 2
NR != FNR {
  split(file1[$1], file1fields);
  if ( abs($2) - abs(file1fields[1]) ||
       abs($3) - abs(file1fields[2]) ||
       abs($4) - abs(file1fields[3]) ||
       abs($5) - abs(file1fields[4]) ||
       abs($6) - abs(file1fields[5]) )
        print;
}

Сохраните это в файл, затем запуститеawk -f /path/to/that/file file1 file2

0
28.04.2021, 23:41

Теги

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