Я использовал команду awk. моя проблема заключалась в том, что каждая строка отличается от других. Поэтому я понятия не имел о номерах столбцов; Я решил это, добавив тест, чтобы найти правильный номер строки для отображения. Вот мой код:
awk '
BEGIN {
# Set awk script delimiter
FS=",";
# Set CSV file separator
OFS=";";
# Set header part in csv file
print "Method; UserId; ClientId; intent; time"
}
/'clientId'/
{
i=1;
msg="";
while(i<=NF) {
if ($i ~ /clientId/) {
# Cleaning column value :
gsub(/\\n\s{1,}clientId:\s/, "",$i);
msg = msg $i ";"
};
if ($i ~ /"time"/) {
# Cleaning column value :
gsub(/"time":/, "",$i);
msg = msg $i ";"
};
if ($i ~ /intent/) {
# Cleaning column value :
gsub(/\\n\s{1,}intent:\s{1,}/, "",$i);
msg = msg $i ";"
};
if ($i ~ /Method/) {
# Cleaning column value :
gsub(/(^(.*?)|\s{1,})Method\s{1,}?:?\s{1,}/, "",$i);
gsub (/(\s{1,}\{\s{1,}userId.*)?/, "", $i);
msg = msg $i ";"
};
if ($i ~ /userId/) {
# Cleaning column value :
gsub(/(^(.*?)|\s{1,})userId:\s/, "",$i);
msg = msg $i ";"
};
i++
} print msg
}
END {
print NR
} '
$(grep -l id *.log) >> output.csv
если вы cd
в папку, в которой хранятся видеофайлы, вы сможете переместить файлы с помощью следующей команды:
mv -v *YYMMDD* /path-to-new-folder
При этом используется сопоставление с шаблоном для перемещения только тех файлов, которые имеют этот формат даты в имени файла. Я обычно использую опцию -v
, поэтому команда распечатывается подробно, и вы знаете, что она что-то сделала.
Одной из возможностей было бы использование GNU Awk (gawk
), который имеет встроенные -функции управления временем. Например, (, предполагая, что если у вас есть gawk
, у вас также есть реализации GNU cp
и mv
)
printf '%s\n' *.mp4 *.avi | gawk -F. '
{
datespec = sprintf("20%02d %02d %02d 00 00 00", substr($2,1,2), substr($2,3,2), substr($2,5,2));
cmd = sprintf("echo cp -t %s/ -- %s", strftime("%Y-%m-%d\\(%a\\)",mktime(datespec)), $0);
system(cmd)
}
'
cp -t 2020-03-29(Sun)/ -- EFGHIJKH.200329.1080p.mp4
cp -t 2020-03-28(Sat)/ -- ABCDABCD.200328.avi
Удалите echo
, как только убедитесь, что он работает правильно. Измените cp
на mv
, если вы хотите переместить, а не копировать.
Другим вариантом для случая перемещения может быть (ab )использование утилиты rename
на основе Perl -:
$ rename -n -e 'BEGIN{use Time::Piece}' -e 's@^[^.]*[.]([0-9]{6})[.].*$@Time::Piece->strptime($1,"%y%m%d")->strftime("%Y-%m-%d(%a)/"). $_@e' *.mp4 *.avi
rename(EFGHIJKH.200329.1080p.mp4, 2020-03-29(Sun)/EFGHIJKH.200329.1080p.mp4)
rename(ABCDABCD.200328.avi, 2020-03-28(Sat)/ABCDABCD.200328.avi)
Здесь удалите -n
после тестирования.
Если я вас правильно понял, вы можете попробовать это с GNU grep
иdate
:
shopt -s nullglob
for file in *.avi *.mp4; do
dat=$(echo "$file" | grep -Po "(?<=\.)[0-9]{6}(?=\.)")
if [[ $(date "+%y%m%d" -d "$dat") ]]; then
dir=$(date -d "$dat" "+%Y-%m-%d(%a)")
cp "$file" "$dir"
fi
done