jq -r --arg ARG1 050112 'select(.login == $ARG1)|
["user:",.login],
["lastlogintime:", if.lastLoginTime then (.lastLoginTime/1000 | strftime("%Y-%m-%d %H:%M UTC")) else "-" end],
["lastloginfrom:",.lastLoginFrom // "-"]
|@tsv' file.json
То есть используйте явноеif
-then
-else
для того, когда lastLoginTime
определено или нет.
Я не думаю, что вы можете сделать это с grep
, нет, но вы можете с awk
. Самый простой подход, который я могу придумать, это сохранить содержимое searchfile.txt
в памяти, а затем печатать его строки каждый раз, когда вы видите индекс:
$ awk -F'\t' 'NR==FNR{c[$1]=$0;next}{if(c[$1]){print c[$1]}}' searchfile.txt index.txt
n0000003 216 -0.334 0.229 0.088 0.154
n0000003 216 -0.334 0.229 0.088 0.154
n0000008 16 0.117 0.200 0.508 0.621
n0000008 16 0.117 0.200 0.508 0.621
n0000017 218 -0.353 0.196 0.042 0.084
n0000017 218 -0.353 0.196 0.042 0.084
n0000017 218 -0.353 0.196 0.042 0.084
n0000017 218 -0.353 0.196 0.042 0.084
Если оба файла отсортированы по индексу, вы также можете использоватьjoin
:
$ join -t$'\t' searchfile.txt index.txt
n0000003 216 -0.334 0.229 0.088 0.154
n0000003 216 -0.334 0.229 0.088 0.154
n0000008 16 0.117 0.200 0.508 0.621
n0000008 16 0.117 0.200 0.508 0.621
n0000017 218 -0.353 0.196 0.042 0.084
n0000017 218 -0.353 0.196 0.042 0.084
n0000017 218 -0.353 0.196 0.042 0.084
n0000017 218 -0.353 0.196 0.042 0.084
Глядя на вашу попытку, кажется, что вы прошли почти рядом со стойкой ворот, но не пропустили мяч. Просто добавили цикл while к вашей попытке.
awk -F'\t' '
FNR == NR { c[$1]++; next }
k = c[$1] { while (k--) print }
' index.txt search.txt