Помощь со скриптом, меняющим целевые и символические ссылки

Неизящная кувалда, но вроде работает

#!/bin/bash

cols=$(echo $(head -n 1 file) | awk '{print gsub(/ /, "")}')
sed -e "1d" -e "s/TRUE/1/g" -e "s/FALSE/0/g" -e "s/ /,/g" file > tmp1
sed "/,S.*/d" tmp1 > tmp2
for s in $(seq 1 $cols); do
    tr=$(cut -d, -f$s tmp1 | paste -s -d+ | bc --)
    if [ $tr -gt 0 ]; then
        trl=$(cut -d, -f$s tmp2 | paste -s -d+ | bc --)
        echo $s $tr $(( $tr-$trl )) $trl
    fi
done | column -t -N Col,True,Small,Large
rm tmp1 tmp2

Выход

Col  True  Small  Large
3    3     2      1
6    3     1      2
9    2     1      1
10   2     0      2

РЕДАКТИРОВАТЬ

Немного менее обидно вawk

#!/bin/bash

sed -e "1d" -e "s/TRUE/1/g" -e "s/FALSE/0/g" file | awk '{
    for (i=1; i<NF; i++)
        {sumall[i]+= $i; if ($NF == "LARGE") {sumlarge[i]+= $i}};
    } END {
    for (x in sumall)
        if (sumall[x] > 0)
            { print x, sumall[x], sumall[x]-sumlarge[x], sumlarge[x]}
    }' | column -t -N Col,True,Small,Large
0
14.01.2021, 22:51
1 ответ

Предполагая, что вы используете инструменты GNU, вы можете определить абсолютные пути для ссылки и цели и использовать ln -rили использовать опцию realpath's --relative-toдля создания целей относительной ссылки.

Вот минимальный пример без проверки работоспособности или очистки резервной копии ссылки:

#!/bin/bash

link=$(realpath -s "$1")  # absolute path to link
target=$(realpath "$1")   # absolute path to target

mv -vf "$link"{,.bak}     # create link backup
mv -vf "$target" "$link"  # move target

# a) use ln -r
ln -vsr "$link" "$target"

# b) or determine the relative path
#target_dir=$(dirname "$target")
#relpath=$(realpath --relative-to="$target_dir" "$link")
#ln -vs "$relpath" "$target"
2
18.03.2021, 22:36

Теги

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