объедините 2 строки на основе тех же значений столбцов

Один подход должен был бы использовать read -ra вместо просто read. Принятие filestoCompare.txt содержавшие 2 столбца с именами файлов в каждом, read -ra прочитал бы оба столбца в одновременно и присвоил бы им в массив, compareFile. К этому массиву можно было затем получить доступ так, чтобы индекс 0 был первым файлом, и индекс 1 был бы 2-м файлом каждый раз через while цикл.

Пример

Скажите, что у меня есть этот файл: filestoCompare.txt, и это содержит следующее:

file1 file2
file3 file4
file5 file6

Команда для прохождения через этого файла была бы следующие:

$ while read -ra a ; do printf "%s\t%s\n" ${a[0]} ${a[1]}; done < filestoCompare.txt
file1   file2
file3   file4
file5   file6

Если эти 2 файла являются действительно отдельными файлами, такими как:

#list1
file1
file2
file3

#list2
file4
file5
file6

Они могут быть объединены с paste управляйте как так:

$ paste list1 list2 > list1and2

Вот содержание list1and2:

$ cat list1and2
file1   file4
file2   file5
file3   file6
5
11.04.2014, 02:38
4 ответа
[1133247] Решение [1133664]perl[1133665]:[12140]
3
27.01.2020, 20:36
[1133223] Незаметно, но, кажется, что работу [12131]
3
27.01.2020, 20:36

Вот еще один подход Perl:

$ perl -ane 'foreach(@F[0..1]){$k{$F[2]}{$_}++}
           END{
                foreach $v (sort keys(%k)){
                    print "$_ " foreach(keys(%{$k{$v}})); 
                    print "$v\n"
                }; 
            } ' file

Это дает:

47723284 47196436 name1
42672249 430695 52856963 name2
380983 55094959 name3
34211 55584836 17926380 54321 3213456 name4

Объяснение

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

#!/usr/bin/perl 

## This is the hash that will store our values. 
my %k;

## Read through the input file line by line
## saving each line as $line. This is what the -n
## switch to perl means, only there each line is saved
## in the special variable $_.
while (my $line=<>) {
    ## Split the line into the @F array. This is
    ## what the -a switch does.
    #chomp($line);
    my @F=split(/\s+/,$line);


    ## Populate the %k hash that we defined at the beginning.
    ## This is a hash of hashes, it looks like this:
    ##   $hash{key1}{key2}=value
    ## In this case, we are saying:
    ##   $hash{3rd field}{1st field}=1 
    ##   $hash{3rd field}{2nd field}=1 
    ## This just serves to add the 1st and 2nd fields
    ## to the list of fields for this $F[2] (the 3rd field, the name).
    ## A side effect of this is that hash keys are unique so duplicates
## are automatically removed.
    $k{$F[2]}{$F[0]}=1;
    $k{$F[2]}{$F[1]}=1;

}

## We have now finished processing the file
## (this is the END{} block above), so let's print.

## This saves the keys of the hash %k in the @names array
## sorted alphabetically.
my @names=(sort keys(%k));


## Go through each of the names, saving
## them as $name
foreach my $name (@names) {
    ## Now, iterate through the values associated 
    ## with the current $name. These are saved as the
    ## keys of the hash %k{$name}
    foreach my $value ( (keys(%{$k{$name}})) ){
      print "$value ";
    } 
    ## Now print the name as well
    print "$name\n";

}

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

2
27.01.2020, 20:36

Если вы не возражаете против использования gawk >= 4.0, то это (что практически то же самое, что terdon's) выдаст желаемый результат, с дополнительным заказом имени и ключей:

NF {
    Names[$3][$1] = 1;
    Names[$3][$2] = 1;
} 
END {
    PROCINFO["sorted_in"] = "@ind_str_asc"; # if you want `Name` ordered
    for (Name in Names) { 
        PROCINFO["sorted_in"] = "@ind_num_asc"; # if you want `Key` ordered
        for (Key in Names[Name]) {
            printf("%s ", Key);
        }
        print Name;
    }
}

дает:

47196436 47723284 name1
430695 42672249 52856963 name2
380983 55094959 name3
34211 54321 3213456 17926380 55584836 name4
0
27.01.2020, 20:36

Теги

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