объединение двух файлов в третий, использование столбцов в качестве индекса и объединение строк - PullRequest
2 голосов
/ 19 января 2012

Я изучал awk и столкнулся с проблемой, которую не могу решить, пожалуйста, помогите, если можете.

У меня есть 2 файла, которые я сгенерировал с помощью awk, sort и uniq -c.

Файл 1 имеет формат:

1 aaa.c 10/10/2010

1 bbb.h 1/1/2011

3 ccc.c 2/2/2012

1 ccc.c 20/6/2011

1 ddd.c 1/1/2010

1 ddd.c 2/4/1999

1 ddd.c 7/1/2012

1 ddd.c 10/1/1977

Значение: number_of_equal_files имя дата (так, 3 файла ccc.c с той же даты и 1 файл ccc.c с другой)

Файл 2 в формате:

4 ddd.c

2 ccc.c

3 xxx.c

Значение: number_of_different_dates name (так, ccc.c был найден с 2 разными датами) -> файлы, которые будут иметь число = 1, я удалил с помощью обратного grep, поэтому не будет никаких

Я бы хотел создать третий файл в формате

.

number_of_different_dates name date1 date2 date 3 date4 (...)

что-то вроде:

2 ccc.c 2/2/2012 20/6/2011 

4 ddd.c 1/1/2010 2/4/1999 7/1/2012 10/1/1977

Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 19 января 2012

Вы должны быть в состоянии получить этот результат, используя только первый файл в качестве входных данных.Далее используются два ассоциативных массива.Первый собирает количество просмотров файла, а второй - даты.Блок END просто печатает записи, которые появились более одного раза.

{
   counts[$2] += 1;
   dates[$2] = sprintf( "%s %s", dates[$2], $3 );
}

END {
   for ( f in dates ) {
      if ( counts[f] > 1 )
     printf( "%d %s %s\n", counts[f], f, dates[f]);
   }
}
1 голос
/ 19 января 2012

Вы можете попробовать что-то вроде этого -

#!/usr/bin/awk -f

NR==FNR{
            a[$3]=$2; b[$2]++;next
       } 

($2 in b){
            printf ("%s %s ", $1,$2);
            for (i in a) 
                if (a[i]==$2) 
                    printf i" "; print ""
          }

Тест:

[jaypal:~/Temp] cat file1
1 aaa.c 10/10/2010

1 bbb.h 1/1/2011

3 ccc.c 2/2/2012

1 ccc.c 20/6/2011

1 ddd.c 1/1/2010

1 ddd.c 2/4/1999

1 ddd.c 7/1/2012

1 ddd.c 10/1/1977

[jaypal:~/Temp] cat file2
4 ddd.c

2 ccc.c

3 xxx.c

[jaypal:~/Temp] ./s.awk ff1 ff2
4 ddd.c 10/1/1977 1/1/2010 2/4/1999 7/1/2012 

2 ccc.c 20/6/2011 2/2/2012 
...