Использование 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"
},
Предположения:
xargs
и cp
, возможно, не -рабочий разделитель NUL в других awk
х)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