если условие между строками внутри разных списков, разобрать списки на совпадения, затем использовать cp

Использование sedдля очистки данных иmlrдля преобразования их в JSON:

h='SSID,BSSID,CHAN,FREQ,SIGNAL,SECURITY'
nmcli -f $h -t dev wifi | 
sed 's/^:/"",/;s/\([^\]\):/\1,/g;s/[\]:/:/g' | 
mlr --c2j --jvstack  --jlistwrap  label $h

Пример вывода:

{
  "SSID": "FooBarBaz",
  "BSSID": "13:F6:8C:56:9B:3B",
  "CHAN": 36,
  "FREQ": "5180 MHz",
  "SIGNAL": 20,
  "SECURITY": "WPA1 WPA2"
},

0
13.04.2020, 13:00
1 ответ

Предположения:

  • Инструменты GNU присутствуют (не -стандартные опции xargsи cp, возможно, не -рабочий разделитель NUL в других awkх)
  • Длина хеша всегда составляет 40 символов
  • Вlist02.txt
  • хэш и путь к файлу всегда разделяются двумя пробелами.
  • В обоих файлах нет вертикальной черты |(, в противном случае используйте другой разделитель)

Первый шаг, объединить оба файла:

join -t'|' -1 2 \
    <(sed -E 's/,(.{40})$/|\1/' list01.txt | sort -t'|' -k2) \
    <(sed -E 's/(.{40})  /\1|/' list02.txt | sort -t'|' -k1)
  • Первый файл :замените разделитель ,на |и отсортируйте файл по второму полю
  • Второй файл :замените разделитель (два пробела )на |и выполните сортировку по первому полю
  • Объединить файлы в хеш-поле

Выход:

3f1dfd39e88e00477483dfd578d5284f5490a0a5|artist'ssomesong.mp3|/path/to/my new music/album.wav
55a5fdde4843fc2f9d9e691cb658b6389d698b22|hello(previous one).sh|/path/to/scripts,regexs/hello(previous one).sh

Затем используйте awk, чтобы проверить, присутствует ли имя файла field2 в качестве имени файла в последнем поле. Если верно, вывести последнее поле с разделителем NUL и передать результат в xargs, чтобы скопировать файлы в каталог назначения.

join -t'|' -1 2 \
    <(sed -E 's/,(.{40})$/|\1/' list01.txt | sort -t'|' -k2) \
    <(sed -E 's/(.{40})  /\1|/' list02.txt | sort -t'|' -k1) \
| awk -F '|' '
  {
    fname1=$2; sub(/.*\//, "", fname1) # extract filename1
    fname2=$3; sub(/.*\//, "", fname2) # extract filename2
  }
  fname1 == fname2{ printf $3 "\0" }   # compare filenames, print filepath with NUL separator
' | xargs -r0 cp -n -t /path/to/destination

Параметры копирования:

  • -nне перезаписывать существующие файлы
  • -tцелевой каталог

Как скрипт:

#!/bin/bash

join -t'|' -1 2 \
    <(sed -E 's/,(.{40})$/|\1/' "$1" | sort -t'|' -k2) \
    <(sed -E 's/(.{40})  /\1|/' "$2" | sort -t'|' -k1) \
| awk -F '|' '
  {
    fname1=$2; sub(/.*\//, "", fname1) # extract filename1
    fname2=$3; sub(/.*\//, "", fname2) # extract filename2
  }
  fname1 == fname2{ printf $3 "\0" }   # compare filenames, print filepath with NUL separator
' | xargs -r0 cp -n -t "$3"

Запустите как:

./script.sh list1 list2 /path/to/destination
0
19.03.2021, 02:29

Теги

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