Bash: compare target date to series of dates
Clash Royale CLAN TAG#URR8PPP
up vote
0
down vote
favorite
Given a target date and a set of two columns (the first being a random number and the second a date in order from most recent to oldest), I want to find the number for the row with the date closest to but earlier than the target. For example, given the following:
target: 2018-12-03 19:09:56.250641
columns:
5346 2018-12-06 17:44:35.010724
6347 2018-12-05 17:50:46.475593
7284 2018-12-04 18:32:11.665405
0298 2018-12-02 22:28:04.59453
1836 2018-12-02 22:27:47.585642
6653 2018-12-02 21:26:13.942103
9274 2018-12-02 21:23:28.318704
I would want to return 0298
. What is the cleanest way to do this?
text-processing date
add a comment |
up vote
0
down vote
favorite
Given a target date and a set of two columns (the first being a random number and the second a date in order from most recent to oldest), I want to find the number for the row with the date closest to but earlier than the target. For example, given the following:
target: 2018-12-03 19:09:56.250641
columns:
5346 2018-12-06 17:44:35.010724
6347 2018-12-05 17:50:46.475593
7284 2018-12-04 18:32:11.665405
0298 2018-12-02 22:28:04.59453
1836 2018-12-02 22:27:47.585642
6653 2018-12-02 21:26:13.942103
9274 2018-12-02 21:23:28.318704
I would want to return 0298
. What is the cleanest way to do this?
text-processing date
add a comment |
up vote
0
down vote
favorite
up vote
0
down vote
favorite
Given a target date and a set of two columns (the first being a random number and the second a date in order from most recent to oldest), I want to find the number for the row with the date closest to but earlier than the target. For example, given the following:
target: 2018-12-03 19:09:56.250641
columns:
5346 2018-12-06 17:44:35.010724
6347 2018-12-05 17:50:46.475593
7284 2018-12-04 18:32:11.665405
0298 2018-12-02 22:28:04.59453
1836 2018-12-02 22:27:47.585642
6653 2018-12-02 21:26:13.942103
9274 2018-12-02 21:23:28.318704
I would want to return 0298
. What is the cleanest way to do this?
text-processing date
Given a target date and a set of two columns (the first being a random number and the second a date in order from most recent to oldest), I want to find the number for the row with the date closest to but earlier than the target. For example, given the following:
target: 2018-12-03 19:09:56.250641
columns:
5346 2018-12-06 17:44:35.010724
6347 2018-12-05 17:50:46.475593
7284 2018-12-04 18:32:11.665405
0298 2018-12-02 22:28:04.59453
1836 2018-12-02 22:27:47.585642
6653 2018-12-02 21:26:13.942103
9274 2018-12-02 21:23:28.318704
I would want to return 0298
. What is the cleanest way to do this?
text-processing date
text-processing date
edited Dec 8 at 12:53
Jeff Schaller
38k1053123
38k1053123
asked Dec 8 at 4:07
Wmbuch
1031
1031
add a comment |
add a comment |
2 Answers
2
active
oldest
votes
up vote
2
down vote
accepted
Since the dates are in Y-M-D H:M:S
order, they could be compared as text (lexicographical or dictionary order in layman terms).
There are three fields (columns), not two. Unless the delimiter for the first column is different than the delimiter for the other columns. As you present the delimiters as space there is no way for us to know if it is an space or a tab or something else. I'll assume three columns delimited by either space or tabs.
To solve this issue, set a variable with the value of the search date and use this command:
s='2018-12-03 19:09:56.250641'
awk -vs="$s" '( $2" "$3 < s ) print $1; exit ' infile
That is:
- Compare the concatenated values of fields 2 and 3 with the value searched.
- When this comparison becomes true (lower)
- Print the first column and exit.
Works perfectly! I'm not too familiar withawk
syntax. Would you mind explaining what$2" "$3 < s
is doing? I get that you're comparing something to thes
variable, but I'm unsure what parts of the input are represented by$2
and$3
– Wmbuch
Dec 8 at 13:42
Second ($2
) and third ($3
) column?.
– Isaac
Dec 8 at 19:52
Oh, I see the problem I was having. I hadn't looked close enough at the time stamps to notice there was a space in them. So when you mentioned a third field, I thought for some weird reasonawk
treated the whitespace as a "field", which didn't make sense to me and threw my whole interpretation of the syntax into disarray :P
– Wmbuch
Dec 8 at 20:18
add a comment |
up vote
0
down vote
I normally would do this with awk
as well, but here's a pipe of text tools to achieve the same result:
$ echo "0000 $s" | sort -k2 - infile | grep -B1 "$s" | head -1 | cut -d" " -f1
0298
add a comment |
Your Answer
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "106"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f486717%2fbash-compare-target-date-to-series-of-dates%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
2
down vote
accepted
Since the dates are in Y-M-D H:M:S
order, they could be compared as text (lexicographical or dictionary order in layman terms).
There are three fields (columns), not two. Unless the delimiter for the first column is different than the delimiter for the other columns. As you present the delimiters as space there is no way for us to know if it is an space or a tab or something else. I'll assume three columns delimited by either space or tabs.
To solve this issue, set a variable with the value of the search date and use this command:
s='2018-12-03 19:09:56.250641'
awk -vs="$s" '( $2" "$3 < s ) print $1; exit ' infile
That is:
- Compare the concatenated values of fields 2 and 3 with the value searched.
- When this comparison becomes true (lower)
- Print the first column and exit.
Works perfectly! I'm not too familiar withawk
syntax. Would you mind explaining what$2" "$3 < s
is doing? I get that you're comparing something to thes
variable, but I'm unsure what parts of the input are represented by$2
and$3
– Wmbuch
Dec 8 at 13:42
Second ($2
) and third ($3
) column?.
– Isaac
Dec 8 at 19:52
Oh, I see the problem I was having. I hadn't looked close enough at the time stamps to notice there was a space in them. So when you mentioned a third field, I thought for some weird reasonawk
treated the whitespace as a "field", which didn't make sense to me and threw my whole interpretation of the syntax into disarray :P
– Wmbuch
Dec 8 at 20:18
add a comment |
up vote
2
down vote
accepted
Since the dates are in Y-M-D H:M:S
order, they could be compared as text (lexicographical or dictionary order in layman terms).
There are three fields (columns), not two. Unless the delimiter for the first column is different than the delimiter for the other columns. As you present the delimiters as space there is no way for us to know if it is an space or a tab or something else. I'll assume three columns delimited by either space or tabs.
To solve this issue, set a variable with the value of the search date and use this command:
s='2018-12-03 19:09:56.250641'
awk -vs="$s" '( $2" "$3 < s ) print $1; exit ' infile
That is:
- Compare the concatenated values of fields 2 and 3 with the value searched.
- When this comparison becomes true (lower)
- Print the first column and exit.
Works perfectly! I'm not too familiar withawk
syntax. Would you mind explaining what$2" "$3 < s
is doing? I get that you're comparing something to thes
variable, but I'm unsure what parts of the input are represented by$2
and$3
– Wmbuch
Dec 8 at 13:42
Second ($2
) and third ($3
) column?.
– Isaac
Dec 8 at 19:52
Oh, I see the problem I was having. I hadn't looked close enough at the time stamps to notice there was a space in them. So when you mentioned a third field, I thought for some weird reasonawk
treated the whitespace as a "field", which didn't make sense to me and threw my whole interpretation of the syntax into disarray :P
– Wmbuch
Dec 8 at 20:18
add a comment |
up vote
2
down vote
accepted
up vote
2
down vote
accepted
Since the dates are in Y-M-D H:M:S
order, they could be compared as text (lexicographical or dictionary order in layman terms).
There are three fields (columns), not two. Unless the delimiter for the first column is different than the delimiter for the other columns. As you present the delimiters as space there is no way for us to know if it is an space or a tab or something else. I'll assume three columns delimited by either space or tabs.
To solve this issue, set a variable with the value of the search date and use this command:
s='2018-12-03 19:09:56.250641'
awk -vs="$s" '( $2" "$3 < s ) print $1; exit ' infile
That is:
- Compare the concatenated values of fields 2 and 3 with the value searched.
- When this comparison becomes true (lower)
- Print the first column and exit.
Since the dates are in Y-M-D H:M:S
order, they could be compared as text (lexicographical or dictionary order in layman terms).
There are three fields (columns), not two. Unless the delimiter for the first column is different than the delimiter for the other columns. As you present the delimiters as space there is no way for us to know if it is an space or a tab or something else. I'll assume three columns delimited by either space or tabs.
To solve this issue, set a variable with the value of the search date and use this command:
s='2018-12-03 19:09:56.250641'
awk -vs="$s" '( $2" "$3 < s ) print $1; exit ' infile
That is:
- Compare the concatenated values of fields 2 and 3 with the value searched.
- When this comparison becomes true (lower)
- Print the first column and exit.
answered Dec 8 at 5:41
Isaac
11k11648
11k11648
Works perfectly! I'm not too familiar withawk
syntax. Would you mind explaining what$2" "$3 < s
is doing? I get that you're comparing something to thes
variable, but I'm unsure what parts of the input are represented by$2
and$3
– Wmbuch
Dec 8 at 13:42
Second ($2
) and third ($3
) column?.
– Isaac
Dec 8 at 19:52
Oh, I see the problem I was having. I hadn't looked close enough at the time stamps to notice there was a space in them. So when you mentioned a third field, I thought for some weird reasonawk
treated the whitespace as a "field", which didn't make sense to me and threw my whole interpretation of the syntax into disarray :P
– Wmbuch
Dec 8 at 20:18
add a comment |
Works perfectly! I'm not too familiar withawk
syntax. Would you mind explaining what$2" "$3 < s
is doing? I get that you're comparing something to thes
variable, but I'm unsure what parts of the input are represented by$2
and$3
– Wmbuch
Dec 8 at 13:42
Second ($2
) and third ($3
) column?.
– Isaac
Dec 8 at 19:52
Oh, I see the problem I was having. I hadn't looked close enough at the time stamps to notice there was a space in them. So when you mentioned a third field, I thought for some weird reasonawk
treated the whitespace as a "field", which didn't make sense to me and threw my whole interpretation of the syntax into disarray :P
– Wmbuch
Dec 8 at 20:18
Works perfectly! I'm not too familiar with
awk
syntax. Would you mind explaining what $2" "$3 < s
is doing? I get that you're comparing something to the s
variable, but I'm unsure what parts of the input are represented by $2
and $3
– Wmbuch
Dec 8 at 13:42
Works perfectly! I'm not too familiar with
awk
syntax. Would you mind explaining what $2" "$3 < s
is doing? I get that you're comparing something to the s
variable, but I'm unsure what parts of the input are represented by $2
and $3
– Wmbuch
Dec 8 at 13:42
Second (
$2
) and third ($3
) column?.– Isaac
Dec 8 at 19:52
Second (
$2
) and third ($3
) column?.– Isaac
Dec 8 at 19:52
Oh, I see the problem I was having. I hadn't looked close enough at the time stamps to notice there was a space in them. So when you mentioned a third field, I thought for some weird reason
awk
treated the whitespace as a "field", which didn't make sense to me and threw my whole interpretation of the syntax into disarray :P– Wmbuch
Dec 8 at 20:18
Oh, I see the problem I was having. I hadn't looked close enough at the time stamps to notice there was a space in them. So when you mentioned a third field, I thought for some weird reason
awk
treated the whitespace as a "field", which didn't make sense to me and threw my whole interpretation of the syntax into disarray :P– Wmbuch
Dec 8 at 20:18
add a comment |
up vote
0
down vote
I normally would do this with awk
as well, but here's a pipe of text tools to achieve the same result:
$ echo "0000 $s" | sort -k2 - infile | grep -B1 "$s" | head -1 | cut -d" " -f1
0298
add a comment |
up vote
0
down vote
I normally would do this with awk
as well, but here's a pipe of text tools to achieve the same result:
$ echo "0000 $s" | sort -k2 - infile | grep -B1 "$s" | head -1 | cut -d" " -f1
0298
add a comment |
up vote
0
down vote
up vote
0
down vote
I normally would do this with awk
as well, but here's a pipe of text tools to achieve the same result:
$ echo "0000 $s" | sort -k2 - infile | grep -B1 "$s" | head -1 | cut -d" " -f1
0298
I normally would do this with awk
as well, but here's a pipe of text tools to achieve the same result:
$ echo "0000 $s" | sort -k2 - infile | grep -B1 "$s" | head -1 | cut -d" " -f1
0298
answered Dec 8 at 12:56
RudiC
3,9541312
3,9541312
add a comment |
add a comment |
Thanks for contributing an answer to Unix & Linux Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f486717%2fbash-compare-target-date-to-series-of-dates%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown