попробуйте (в одной строке я складываю для удобства чтения) аргумент
tar -zcvf api_v2.x.tar.gz
--exclude api/distributor_test.php
--exclude api/library/Distributor_API.php api
api
) следует поставить последним 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
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