Объединить списки на основе повторяющихся значений

попробуйте (в одной строке я складываю для удобства чтения) аргумент

tar -zcvf api_v2.x.tar.gz 
   --exclude api/distributor_test.php 
   --exclude api/library/Distributor_API.php api
  • (например, api ) следует поставить последним
  • вы можете использовать --exclude Distributor_test.php (если у вас есть только один файл с именем distributionor_test.php)
2
08.03.2018, 18:09
2 ответа

Awkраствор:

awk '{ 
         if (NF == 2) {
             if ($1 in r) { 
                 a[r[$1]] = a[r[$1]] OFS $2; next 
             } 
             a[$1] = $2; r[$2] = $1; 
         } 
         else a[$1]; 
     }
     END{ for (i in a) print i, a[i]  }' file
  • NF == 2-условие, указывающее запись с 2 полями(NF-общее количество полей)
  • a-массив, который содержит либо «автономные» имена файлов (, которые не были переименованы ), например bи d, либо связь между исходным именем файла и его переименованной версией (, например.a -> f)
  • r-массив, который содержит противоположное отношение «переименованное имя файла» -> «начальное имя файла» (, например.f -> a)

Выход:

a f z
b 
c e
d 

В случае, если какое-то имя файла могло быть переименовано более одного раза -, используйте следующее расширенное решение:

awk '{ 
         if (NF == 2) {
             if ($1 in r) { 
                 a[r[$1]] = a[r[$1]] OFS $2; r[$2] = r[$1];
             } 
             else { a[$1] = $2; r[$2] = $1 } 
         } 
         else a[$1]; 
     }
     END{ for (i in a) print i, a[i]  }' file
2
27.01.2020, 22:03
gawk '
{
    arr[cnt][0] = $1    
    arr[cnt++][1] = $2  
}
END {
    for(i = 0; i < cnt; i++) {
        if(!arr[i][0]) continue

        next_name = arr[i][0]

        for(j = i; j < cnt; j++) {
            if(arr[j][0] != next_name) continue

            if(arr[j][1]) {
                next_name = arr[j][1]
                delete arr[j]
            }
            printf "%s ", next_name

        }
        print ""
    }
}' cnt=0 input.txt

Вход(сложный для тестирования)

u
a
a f
b
c
c e
d
c
f g
g a
a i
i j
a
a z
z w

Выход

u 
a f g a i j 
b 
c e 
d 
c 
a z w 
1
27.01.2020, 22:03

Теги

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