Вы можете получить текущее время эпохи с помощью
date "+%s"
Вы также можете преобразовать любой формат времени во время эпохи:
date -d "${MY_TIME}" "+%s"
И эти времена эпохи вы можете вычесть .
Имея строку с BarDate: 2017-11-31
в переменной LINE, вы можете извлечь дату, используя:
MY_TIME=$(echo $LINE | cut -d: -f2)
$ paste file1 file2 | awk -F '\t' '$1 == "X" { $1 = $2 } { print $1 }'
1
4
5
5
X
7
Команда paste
создаст вывод с разделителями табуляцией -
1 2
4 3
X 5
5 X
X X
7 1
и сценарий awk
просто устанавливает первое поле, разделенное табуляцией, на содержимое второго поля, если первое является символом X
, а затем печатает первое поле (, теперь возможно измененное ).
Другой подход , предложенный glenn jackman , который не изменяет входящие данные, а просто выбирает поле для печати в зависимости от данных в первом столбце:
$ paste file1 file2 | awk -F '\t' '{ print $1 == "X" ? $2 : $1 }'
Использование GNUsed
:
$ paste file1 file2 | sed -E -e '/^X/s/^[^\t]+\t//' -e 's/\t.*$//'
1
4
5
5
X
7
Два sed
выражения делают следующее:
X
, то первая замена удаляет все до первого символа табуляции включительно. Это эффективно перемещает второй столбец вывода paste
в первый столбец, если первый столбец является X
. С ударом
while IFS= read -r -u3 f1; IFS= read -r -u4 f2; do
[[ $f1 == X ]] && echo "$f2" || echo "$f1"
done 3<file1 4<file2
или, в более общем смысле, POSIX
while IFS= read -r f1 <&3; IFS= read -f f2 <&4; do
[ "$f1" = X ] && echo "$f2" || echo "$f1"
done 3<file1 4<file2
Если файл file2 помещается в памяти, вы можете использовать awk. Пусть он сначала прочитает в файле2, затем, когда он обрабатывает файл1, если он увидит «X», замените его из массива файл2:
$ awk 'NR == FNR { lines[NR]=$0; } NR != FNR { if ($0 == "X") print lines[FNR]; else print $0 }' file2 file1
Re -отформатировано, это:
$ awk 'NR == FNR { lines[NR]=$0; }
NR != FNR { if ($0 == "X") print lines[FNR];
else print $0
}' file2 file1
Обратите внимание, что файл2 — это первое имя файла; file1 — это второе имя файла.