Попробуйте сделать это с флагом rsync -R (--относительный ):
$ for i in ls./*/filename; do rsync -avR $i../test2; done
Флаг -R синхронизирует полный путь, указанный в командной строке.
Причина такого поведения, которое вы видите, заключается в том, что по умолчанию awk
рассматривает WHITESPACE
(, т. е. пробел, вкладку )как разделитель полей ввода. Таким образом, каждый элемент в вашем входном файле, окруженный пробелом, рассматривается как одно "поле" и назначается собственной $<number>
внутренней переменной. Однако ваша команда awk
указывает awk
печатать только первые два таких поля($1
и $2
), которые в вашем случае представляют собой строку даты/времени и литерал tid:
.
В вашем конкретном случае самым простым способом может быть использование sed
для замены первого белого -пробела табулятором, что должно дать желаемый результат.
Поскольку вы также хотите включить строку заголовка, следующее должно работать (при условии, что используется GNU sed
):
sed -e '1 i\DateTime\tError' -e 's/ /\t/' TMP.txt > Output.txt
Первое выражение вставляет одну строку текста в начало строки, второе выполняет предполагаемое «фактическое форматирование».
Обновление
Для предоставленного вами дополнительного формата строки я бы прибегнул к awk
вместоsed
(обратите внимание, что я использую GNU awk):
awk 'BEGIN{printf("DateTime\tError\n")} {match($0,"^([[:alpha:]]{3}[[:space:]]+[0123]?[[:digit:]],[[:space:]]+20[[:digit:]]{2}[[:space:]]+[01]?[[:digit:]]:[012345][[:digit:]]:[012345][[:digit:]][[:space:]]+[AP]M[[:space:]]+[[:alpha:]]+)[[:space:]]+([[:print:]]*)$", fields); printf("%s\t%s\n", fields[1], fields[2])}' TMP.txt > Output.txt
Это регулярное выражение соответствует указанному вами формату времени, за которым следует один или несколько пробелов, за которыми следуют произвольные печатные символы до конца строки, и печатает первую (...)
подгруппу -, отметку времени, затем \t
, а затем вторую (...)
подгруппу -, которая является «остальной частью строки». Кроме того, якорь BEGIN
используется для вставки строки заголовка сверху.
Поскольку оба случая могут встречаться в одном и том же файле, мы должны объединить их в одну awk
программу:
BEGIN {
printf("DateTime\tError\n");
}
{
if (match($0,"^([[:alpha:]]{3}[[:space:]]+[0123]?[[:digit:]],[[:space:]]+20[[:digit:]]{2}[[:space:]]+[012]?[[:digit:]](:[012345][[:digit:]]){2}[[:space:]]+[AP]M[[:space:]]+[[:upper:]]+)[[:space:]]+([[:print:]]*)$", fields) == 0)
match($0,"^(20[[:digit:]]{2}-[01][[:digit:]]-[0123][[:digit:]][[:alpha:]][012][[:digit:]](:[012345][[:digit:]]){2}.[[:digit:]]{3}[+-][012][[:digit:]]:[012345][[:digit:]])[[:space:]]+([[:print:]]*)$", fields);
printf("%s\t%s\n", fields[1], fields[3]);
}
Вы можете вызвать приведенный выше скрипт xlsconvert.awk
, а затем вызвать его как
user@host$ awk -f xlsconvert.awk TMP.txt > Output.txt
Обратите внимание, что это, конечно, сохранит различные форматы временных меток в выходных данных. Если вы хотите преобразовать это в унифицированный формат, вам, возможно, придется прибегнуть к сценарию оболочки.