Удаленное перезаписывание файла crontab на sudo

sed -e'$!N;s/^\(a test\n\)Please do not be$/not \1Be/;P;D' <in >out

Просто немного расширите окно ввода.

Это довольно просто. Помимо стандартной замены; здесь вам нужны только $! N , P и D .

1
11.02.2019, 17:52
4 ответа

Вам нужно прочитать файл строка за строкой и создать структуру данных, которая связывает фрукты со списком номеров магазинов. Вы можете сделать это с многомерными массивами 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
0
28.01.2020, 00:19

Попробуйте:

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
0
28.01.2020, 00:19

Я использовал описанный ниже метод для достижения того же самого

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
0
28.01.2020, 00:19

Другая версия, использующая 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
0
28.01.2020, 00:19

Теги

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