создание новых столбцов

Чтобы извлечь часть перед 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
1
21.03.2019, 16:14
5 ответов

Предполагая, что оба файла отсортированы по первому столбцу:

$ join file1 file2
a 1
a 1
b 2
c 3
c 3
c 3
d 4
d 4

Утилита joinвыполняет реляционную операцию INNER JOIN над двумя входными файлами. По умолчанию первый столбец является столбцом соединения, и ввод должен быть отсортирован по этому столбцу .

2
27.01.2020, 23:22

Я не думаю, что для этого действительно нужен сценарий оболочки, но если вы хотите (, например. если у вас нет 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
0
27.01.2020, 23:22

С помощью 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
1
27.01.2020, 23:22

Я пробовал описанный ниже метод, и он работал нормально

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
0
27.01.2020, 23:22

с Миллером(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
0
27.01.2020, 23:22

Теги

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