Могу ли я с помощью одной команды вырезать два выходных файла для двух полей моего входного файла?

Дробная часть не влияет на количество часов, минут или секунд, поэтому вы можете просто оставить ее в стороне, выполнить вычисления без нее и добавить ее в конце. . Что-то вроде этого:

#!/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).

0
12.12.2016, 12:28
2 ответа

Не с помощью одной команды 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 может быть не завершен к тому времени, когда вы запустите следующую команду после этого.

5
28.01.2020, 02:19

Я думаю, вы можете сделать вот так:

cut -f1 input | tee output1 | cut -f1 > output2

Если ваше желание заполнено первой и второй колонками.

-1
28.01.2020, 02:19

Теги

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