AWK - суммировать плюсовые и минусовые значения в отдельные переменные

С помощью zsh вы может сделать:

files=(${(f)"$(cut -d , -f 1 <movies.csv)"})
glob=('$files['{1..$#files}']')
eval "tocopy=(Movies/**/(${(j:|:)glob})(D.))"
print -rl -- $tocopy # to  check it's OK
cp -i -- $tocopy Sorted_Media/

Объяснение:

  • cut -d, -f1 : получить первый столбец csv (одно имя файла в строке).
  • $ {(f) "$ (cmd)"} : разделить вывод cmd на перевод строки ( $ files теперь представляет собой массив со всем файлом имена).
  • glob = ('$ files [' {1 .. $ # files} ']') : создать еще один массив с элементами буквально $ files [1] , $ files [2] ...
  • $ {(j: |:) array} : объединить элементы массива с помощью | , поэтому мы в основном оцениваем tocopy = (Фильмы / ** / ($ files [1] | $ files [2] | ... | $ files [n]) (DN.)) команда (где n - количество элементов в массиве $ files ).
  • ** / : рекурсивная глобализация (поиск файлов в подкаталогах любого уровня).
  • (D.) : квалификаторы glob (поиск также и в скрытых каталогах (D), только в обычных файлах (.))

Или с помощью инструментов GNU:

find Movies -type f -print0 |
  awk '
    !d {f[$1]; next}
    $NF in f {
      delete f[$NF]
      print
    }' FS=, file.csv d=1 FS=/ RS='\0' ORS='\0' - |
  xargs -r0 cp -vt Sorted_Media/

Используя delete , мы убеждаемся, что копируется только первый экземпляр (если есть несколько файлов с одинаковым именем). -i в решении zsh дает вам возможность решить, что делать в случае конфликта. Мы не можем использовать здесь -i , потому что стандартный ввод cp больше не является терминалом.

Замените cp на echo cp , если вы просто хотите проверить, что он будет делать, не делая этого на самом деле.

0
23.05.2019, 03:03
2 ответа
$ set -f; IFS=" " 
$ set $(perl -F\; -lane '$A[$F[1]<0] += $F[1]}{print "@A"' "$file") 
$ plus=$1 minus=$2
1
28.01.2020, 02:22

плюс:

awk -F';' '$2~/^[^\-]/{s+=$2} END{print s}'  data

минус:

awk -F';' '$2~/^[\-]/{s+=$2} END{print s}'  data
1
28.01.2020, 02:22

Теги

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