Дробная часть не влияет на количество часов, минут или секунд, поэтому вы можете просто оставить ее в стороне, выполнить вычисления без нее и добавить ее в конце. . Что-то вроде этого:
#!/bin/sh
seconds=16633.284
f=${seconds##*.}
if [ "$f" = "$seconds" ]; then f=0; fi
t=${seconds%.*}
s=$((t%60))
m=$((t/60%60))
h=$((t/60/60))
printf '%d:%02d:%06.3f\n' $h $m $s.$f
Вывод:
0 → 0:00:00.000
33. → 0:00:33.000
.21 → 0:00:00.210
60.394 → 0:01:00.394
8944.77 → 2:29:04.770
Это работает в любой sh-подобной оболочке (кроме некоторых древних до-POSIX).
Не с помощью одной команды cut
. Вы можете сделать это с помощью awk
:
awk -F '\t' '{print $1 > "file1"; print $2 > "file2"}' < file
Или для каждого поля:
awk -F '\t' '{for (i = 1; i <= NF; i++) print $i > "file" i}' < file
Или, чтобы избежать чтения файла дважды, с конвейерами и двумя вызовами cut
, с оболочкой типа AT&T ksh, zsh или bash с поддержкой подстановки процессов:
< file tee >(cut -f2 > file2) | cut -f1 > file1
Помните, что ksh
и bash
не ждут этого сокращения
команда, выполняемая в процессе подстановки, поэтому в этих оболочках файл2
может быть не завершен к тому времени, когда вы запустите следующую команду после этого.
Я думаю, вы можете сделать вот так:
cut -f1 input | tee output1 | cut -f1 > output2
Если ваше желание заполнено первой и второй колонками.