Как преобразовать txt в xls в Unix?

Попробуйте сделать это с флагом rsync -R (--относительный ):

$ for i in ls./*/filename; do rsync -avR $i../test2; done

Флаг -R синхронизирует полный путь, указанный в командной строке.

0
28.11.2019, 14:41
1 ответ

Причина такого поведения, которое вы видите, заключается в том, что по умолчанию 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

Обратите внимание, что это, конечно, сохранит различные форматы временных меток в выходных данных. Если вы хотите преобразовать это в унифицированный формат, вам, возможно, придется прибегнуть к сценарию оболочки.

0
28.01.2020, 03:05

Теги

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