Сравнение несортированных и смешанных файлов дел для выбора только уникальных записей

Мое решение состояло в том, чтобы писать напрямую в rtc, используя ioctrl. Вот реализация для тех, кто сталкивался с этим:

#include <linux/rtc.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys/ioctl.h>


int main(void)
{
  int fd;
  fd = open("/dev/rtc0",0);
  if (fd < 0)
    printf("Can't open rtc!");

  struct rtc_time time;

  time.tm_sec = 12;
  time.tm_min = 12;
  time.tm_hour = 7;
  time.tm_mday = 12;
  time.tm_mon = 7;
  time.tm_year = 118;

  if (ioctl(fd, RTC_SET_TIME, &time) < 0 )
    printf("Set rtc failed!");

  return 0;
}
0
30.11.2021, 07:52
2 ответа

Попробуйте это awk . Работает с любым количеством файлов из коробки.

Примечание :Будьте осторожны с пробелами в конце слов во входных данных.

$ awk '{ str=tolower($0); a[str]++; aa[str]=$0; b[str]=b[str]" "FILENAME } 
    END{ for(i in a){ if(a[i]==1){ print aa[i],b[i] } } }' file1 file2
address_3  file1
Bill_ID  file2

Если вы хотите, чтобы таблица -была похожа на вывод, добавьте один форматирующий awk к первому. Результат готов для копирования -и вставки, например. Эксель. Конечно, TAB s и , в строках портят форматирование.

$ awk '{ str=tolower($0); a[str]++; aa[str]=$0; b[str]=b[str]","FILENAME }
    END{ for(i in a){ if(a[i]==1){ print aa[i]b[i] } } }' file1 file2 |
  awk -F ',' '{ nm_a[$NF]++; a[$NF,nm_a[$NF]]=$1 } 
    END{ for(i in nm_a){ printf "%s\t",i; if(max<nm_a[i]){ max=nm_a[i] } }; 
    print "";  for(j=1;j<=max;j++){ for(i in nm_a){ printf "%s\t",a[i,j] } 
    print "" } }' 
file2   file1   
Bill_ID address_3
0
30.11.2021, 10:27

Предполагая, что, как и в вашем опубликованном образце ввода, одно и то же слово не появляется несколько раз ни в одном из входных файлов, а затем при использовании любого awk в любой оболочке на каждом компьютере Unix:

$ cat tst.awk
BEGIN {
    OFS="\t"
    print ARGV[1], ARGV[2]
}
{ lc = tolower($1) }
NR==FNR {
    file1[lc] = $1
    next
}
lc in file1 {
    delete file1[lc]
    next
}
{
    print "", $1
}
END {
    for (lc in file1) {
        print file1[lc], ""
    }
}

$ awk -f tst.awk file1 file2
file1   file2
        Bill_ID
address_3
0
30.11.2021, 14:09

Теги

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