Сравните два файла на основе значений в их последнем столбце

Если у них есть одна учетная запись, этого должно быть достаточно, но если у каждого из ваших родителей есть собственный логин , вы можете проверить, что группы настроены одинаково, особенно если они совместно используют файлы и используют разрешения группы для чтения и записи в некотором общем каталоге. Вы можете добавить группу с помощью groupadd и использовать usermod , чтобы добавить такую ​​группу к учетным записям, созданным useradd (если вы сначала выполните groupadd вы также можете указать группу в качестве опции для useradd )

5
21.01.2017, 01:32
3 ответа
$ cat fileA fileB | sort -k3,3 -k4,4nr | sort -k3,3 -u
a b c 10
d e f 15
g h i 15
j k l 20
p l m 35
w x z 40

Это конвейер из трех частей:

  1. Объединить файлA с файлB .
  2. Сортировка объединенного файла в порядке убывания номеров на основе четвертого столбца для каждого уникального значения в третьем столбце. Результатом этого шага будет

     abc 10 
    def 15 
    def 11 
    ghi 15 
    jkl 20 
    jkl 15 {{1} } plm 35 
    wxz 40 
     
  3. Отсортируйте это снова, но удалите дубликаты и используйте только третий столбец в качестве ключа сортировки. Так как это оставит строку с первым найденным экземпляром ключа сортировки, но отбросит строки с дублированными ключами сортировки (и с меньшими значениями в четвертом столбце, благодаря сортировке first ), это даст нам желаемый результат.

Этот подход полностью игнорирует содержимое первых двух столбцов.

0
27.01.2020, 20:43

Если ваш интерпретатор awk находится в / usr / bin /:

cat doit.awk

#!/usr/bin/awk

NF!=4 {

    print "Field number must be 4" > "/dev/stderr";
    exit 1;
}

FILENAME=="file_a" {

    i++;
    numval_a[i]=$4;
    letters_a[i]=$1FS$2FS$3;
}

FILENAME=="file_b" {

    k++;
    numval_b[k]=$4;
    letters_b[k]=$1FS$2FS$3;
}

END {

    for(j=1; j<=i; j++) {

        if(letters_a[j]!=letters_b[j]) {

            print "Line missmatch!" > "/dev/stderr";
            exit 2;
        }

        if(numval_a[j]>numval_b[j])
            max=numval_a[j];
        else
            max=numval_b[j];

        print letters_a[j], max;
    }
}

awk -f doit.awk file_a file_b

a b c 10
d e f 15
g h i 20
j k l 25
0
27.01.2020, 20:43

Примерно так:

awk '$4>n[$3]{n[$3]=$4;l[$3]=$0}END{for(i in l)print l[i]}' file_a file_b > file_c

Объяснение: если 4-й столбец больше запомненного максимума для того же 3-го столбца (в массиве n ), то запомните новый 4-й столбец и всю строку (в ] l массив) для этого 3-го столбца. В конце выведите все запомненные строки.

1
27.01.2020, 20:43

Теги

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