Неизящная кувалда, но вроде работает
#!/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
Предполагая, что вы используете инструменты 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"