sed -e'$!N;s/^\(a test\n\)Please do not be$/not \1Be/;P;D' <in >out
Просто немного расширите окно ввода.
Это довольно просто. Помимо стандартной замены; здесь вам нужны только $! N
, P
и D
.
Вам нужно прочитать файл строка за строкой и создать структуру данных, которая связывает фрукты со списком номеров магазинов. Вы можете сделать это с многомерными массивами awk или с массивом массивов GNU awk.
Затем, после прочтения файла, вы будете перебирать фрукты и для каждого фрукта распечатывать строку для каждого магазина.
Я бы использовал для этого perl, но синтаксис perl может быть несколько громоздким.
perl -lane '
if ($. == 1) {print; next}
push @{$shops{$F[0]}}, $F[1];
}END{
for $fruit (sort {lc $a cmp lc $b} keys %shops) {
$label = $fruit;
for $shop (@{$shops{$fruit}}) {
printf "%s\t%s\n", $label, $shop;
$label = "";
}
}
' file
Попробуйте:
sort -t $'\t' <(tail -n+2 infile) |awk 'seen[$1]++{ $1="" }1' OFS='\t'
Apple x1
x3
banana x2
x3
orange x1
x2
Я не понимаю, зачем вам пустые имена фруктов, которые вы можете просто запросить нужные вам данные, все, кроме результата, вы можете считать его пустым.
sort -t $'\t' -uk1,1 <(tail -n+2 infile)
Apple x1
banana x2
orange x1
Я использовал описанный ниже метод для достижения того же самого
for i in `awk '{print $1}' y.txt| sort| uniq| tr "\n" " "`; do awk -v i="$i" '$1 == i {print $2}' y.txt| sed "1s/.*/$i\t&/g"| sed '/^x/s/.*/\t&/g';done| sed '1i fruits shopname '
выход
fruits shopname
Apple x1
x3
banana x2
x3
orange x1
x2
Другая версия, использующая sed, но первая, создающая входной файл.
Убедитесь, что вы отключили расширение истории bash с помощью set +H
перед запуском этого
Код:(скопируйте и вставьте в свою оболочку)
# replace comma with tab to enable copy&paste from stackexchange,
# sort the table, write the file
cat <<EOF | tr ";" "\t" |sort > fruits.txt
Apple;x1
orange;x1
banana;x2
Apple;x3
orange;x2
banana;x3
EOF
echo "BEFORE:"
cat fruits.txt
for fruit in $(cut -f1 fruits.txt|sort -u); do sed -i "/$fruit/!b;n;s/^\w\+//" fruits.txt; done
echo "RESULT:"
cat fruits.txt
Выход:
BEFORE:
Apple x1
Apple x3
banana x2
banana x3
orange x1
orange x2
RESULT:
Apple x1
x3
banana x2
x3
orange x1
x2