Чтобы извлечь часть перед T
, с оболочками POSIX:
time=2017-03-08T19:41:26Z
utc_date=${time%T*} # as already said
Или для совместимости с Борном или для оболочек, не относящихся к POSIX:
expr "$time" : '\(.*\)T'
Обратите внимание, что 2017-03-08T19 : 41: 26Z
- это зулусское время (другое название UTC), недвусмысленное указание точного момента времени.
В то время это было 8 марта 2017 года в Лондоне, но 9 марта 2017 года (ранним утром) в Бангкоке.
Если вы хотите узнать местную дату (в отличие от даты в формате UTC) для этой спецификации времени, то это для пользователя Бангкока, чтобы получить 2017-03-09, а для пользователя из Лондона, чтобы получить 2017 -03-08, есть несколько вариантов.
С датой GNU
:
time=2017-03-08T19:41:26Z
date -d "$time" +%F
(просто, поскольку дата GNU распознает этот формат zulu из коробки)
То же самое с ksh93
:
printf '%(%F)T\n' "$time"
С zsh
встроенные модули:
zmodload zsh/datetime
TZ=UTC0 strftime -rs unix_time %Y-%m-%dT%TZ $time &&
strftime %Y-%m-%d $unix_time
(вы можете заменить % Y-% m-% d
на % F
в таких системах, как GNU, где strftime ()
/ strptime ()
поддерживают это).
Похоже на busybox date
:
unix_time=$(date -u -D %Y-%m-%dT%TZ -d "$time" +%s)
date -d "@$unix_time" +%Y-%m-%d
Предполагая, что оба файла отсортированы по первому столбцу:
$ join file1 file2
a 1
a 1
b 2
c 3
c 3
c 3
d 4
d 4
Утилита join
выполняет реляционную операцию INNER JOIN над двумя входными файлами. По умолчанию первый столбец является столбцом соединения, и ввод должен быть отсортирован по этому столбцу .
Я не думаю, что для этого действительно нужен сценарий оболочки, но если вы хотите (, например. если у вас нет join, grep и т. д. ), это только -встроенная необходима:
#you should not have spaces in start of file1.txt or file2.txt
search_first_col(){
while read -r col nextcol ; do
case $col in "$1")
echo "$col $nextcol" ;;
esac
done
}
while IFS= read -r lin ; do
search_first_col "$lin" </tmp/file1.txt
done </tmp/file2.txt
С помощью awk чтение первого файла в массив и печать из него на основе второго файла. Входные данные не нужно сортировать здесь:
$ awk 'FNR==NR { a[$1] = $2; next } { print $1, a[$1] }' file1 file2
a 1
a 1
b 2
c 3
c 3
c 3
d 4
d 4
Я пробовал описанный ниже метод, и он работал нормально
for i in `cat file1| awk '{print $1}'`; do h=`awk -v i="$i" '$1 == i{print $2}' file1`;awk -v i="$i" -v h="$h" '$1==i{print $0 " " h}' file2;done
выход
for i in `cat file1| awk '{print $1}'`; do h=`awk -v i="$i" '$1 == i{print $2}' file1`;awk -v i="$i" -v h="$h" '$1==i{print $0 " " h}' file2;done
a 1
a 1
b 2
c 3
c 3
c 3
d 4
d 4
с Миллером(https://github.com/johnkerl/miller/releases)
mlr --nidx --fs " " join -j 1 -f file2 file2
у вас есть
a 1
a 1
b 2
c 3
c 3
c 3
d 4
d 4