Extract `m`th (first) column value for line with specific `n`th (second) column value from file
Clash Royale CLAN TAG#URR8PPP
up vote
6
down vote
favorite
I need to Write an awk
command that will return the identification number from the following table for only the lines where the title is Turtle
. This table is stored in turtle.txt
Id Num. Title CatchDate
433417 RedTurtle 2001-06-29
493303 BlueTurtle 1998-09-20
259497 Turtle 1985-05-08
229505 RedTurtle 1994-07-13
473076 OrangeTurtle 2002-03-08
221907 Blueturtle 1999-07-02
457032 Turtle 1993-04-09
490359 RedTurtle 1996-11-12
494595 SnappingTurtle 1985-05-20
402421 BlueTurtle 1999-08-16
text-processing awk sed
New contributor
add a comment |Â
up vote
6
down vote
favorite
I need to Write an awk
command that will return the identification number from the following table for only the lines where the title is Turtle
. This table is stored in turtle.txt
Id Num. Title CatchDate
433417 RedTurtle 2001-06-29
493303 BlueTurtle 1998-09-20
259497 Turtle 1985-05-08
229505 RedTurtle 1994-07-13
473076 OrangeTurtle 2002-03-08
221907 Blueturtle 1999-07-02
457032 Turtle 1993-04-09
490359 RedTurtle 1996-11-12
494595 SnappingTurtle 1985-05-20
402421 BlueTurtle 1999-08-16
text-processing awk sed
New contributor
1
I'm amazed that this simple question could attract 6 answers so far.
â simlev
11 hours ago
@simlev, the Hot Network Questions algorithm is a mystery; it's contributing to the views & votes here
â Jeff Schaller
11 hours ago
Hi Kamat. I generalized the title of your question. The answer would be the same if this was about, say, a part number / description / price table, so the fact that it's about animals in this case seems inconsequential to answering the question.
â Michael Kjörling
9 hours ago
(1)â¯IâÂÂm amazed that a trivial question like this can accumulate five edits (by five different people), six upvotes, no downvotes, and no closeâ¯votes (after approximately 7â¯hours).âÂÂ(2)â¯@MichaelKjörling: Wow, that is the general version of the title?!â When I saw the title âÂÂExtract first column value for line with specific second column value from three-columns file with awkâÂÂ, my first thought was that it should be renamed to âÂÂExtract a field from a line based on a value in another fieldâÂÂ.
â G-Man
6 hours ago
Possible duplicate of filter based on a field value in awk
â G-Man
36 secs ago
add a comment |Â
up vote
6
down vote
favorite
up vote
6
down vote
favorite
I need to Write an awk
command that will return the identification number from the following table for only the lines where the title is Turtle
. This table is stored in turtle.txt
Id Num. Title CatchDate
433417 RedTurtle 2001-06-29
493303 BlueTurtle 1998-09-20
259497 Turtle 1985-05-08
229505 RedTurtle 1994-07-13
473076 OrangeTurtle 2002-03-08
221907 Blueturtle 1999-07-02
457032 Turtle 1993-04-09
490359 RedTurtle 1996-11-12
494595 SnappingTurtle 1985-05-20
402421 BlueTurtle 1999-08-16
text-processing awk sed
New contributor
I need to Write an awk
command that will return the identification number from the following table for only the lines where the title is Turtle
. This table is stored in turtle.txt
Id Num. Title CatchDate
433417 RedTurtle 2001-06-29
493303 BlueTurtle 1998-09-20
259497 Turtle 1985-05-08
229505 RedTurtle 1994-07-13
473076 OrangeTurtle 2002-03-08
221907 Blueturtle 1999-07-02
457032 Turtle 1993-04-09
490359 RedTurtle 1996-11-12
494595 SnappingTurtle 1985-05-20
402421 BlueTurtle 1999-08-16
text-processing awk sed
text-processing awk sed
New contributor
New contributor
edited 11 mins ago
Isaac
7,85711137
7,85711137
New contributor
asked 14 hours ago
Kamat
383
383
New contributor
New contributor
1
I'm amazed that this simple question could attract 6 answers so far.
â simlev
11 hours ago
@simlev, the Hot Network Questions algorithm is a mystery; it's contributing to the views & votes here
â Jeff Schaller
11 hours ago
Hi Kamat. I generalized the title of your question. The answer would be the same if this was about, say, a part number / description / price table, so the fact that it's about animals in this case seems inconsequential to answering the question.
â Michael Kjörling
9 hours ago
(1)â¯IâÂÂm amazed that a trivial question like this can accumulate five edits (by five different people), six upvotes, no downvotes, and no closeâ¯votes (after approximately 7â¯hours).âÂÂ(2)â¯@MichaelKjörling: Wow, that is the general version of the title?!â When I saw the title âÂÂExtract first column value for line with specific second column value from three-columns file with awkâÂÂ, my first thought was that it should be renamed to âÂÂExtract a field from a line based on a value in another fieldâÂÂ.
â G-Man
6 hours ago
Possible duplicate of filter based on a field value in awk
â G-Man
36 secs ago
add a comment |Â
1
I'm amazed that this simple question could attract 6 answers so far.
â simlev
11 hours ago
@simlev, the Hot Network Questions algorithm is a mystery; it's contributing to the views & votes here
â Jeff Schaller
11 hours ago
Hi Kamat. I generalized the title of your question. The answer would be the same if this was about, say, a part number / description / price table, so the fact that it's about animals in this case seems inconsequential to answering the question.
â Michael Kjörling
9 hours ago
(1)â¯IâÂÂm amazed that a trivial question like this can accumulate five edits (by five different people), six upvotes, no downvotes, and no closeâ¯votes (after approximately 7â¯hours).âÂÂ(2)â¯@MichaelKjörling: Wow, that is the general version of the title?!â When I saw the title âÂÂExtract first column value for line with specific second column value from three-columns file with awkâÂÂ, my first thought was that it should be renamed to âÂÂExtract a field from a line based on a value in another fieldâÂÂ.
â G-Man
6 hours ago
Possible duplicate of filter based on a field value in awk
â G-Man
36 secs ago
1
1
I'm amazed that this simple question could attract 6 answers so far.
â simlev
11 hours ago
I'm amazed that this simple question could attract 6 answers so far.
â simlev
11 hours ago
@simlev, the Hot Network Questions algorithm is a mystery; it's contributing to the views & votes here
â Jeff Schaller
11 hours ago
@simlev, the Hot Network Questions algorithm is a mystery; it's contributing to the views & votes here
â Jeff Schaller
11 hours ago
Hi Kamat. I generalized the title of your question. The answer would be the same if this was about, say, a part number / description / price table, so the fact that it's about animals in this case seems inconsequential to answering the question.
â Michael Kjörling
9 hours ago
Hi Kamat. I generalized the title of your question. The answer would be the same if this was about, say, a part number / description / price table, so the fact that it's about animals in this case seems inconsequential to answering the question.
â Michael Kjörling
9 hours ago
(1)â¯IâÂÂm amazed that a trivial question like this can accumulate five edits (by five different people), six upvotes, no downvotes, and no closeâ¯votes (after approximately 7â¯hours).âÂÂ(2)â¯@MichaelKjörling: Wow, that is the general version of the title?!â When I saw the title âÂÂExtract first column value for line with specific second column value from three-columns file with awkâÂÂ, my first thought was that it should be renamed to âÂÂExtract a field from a line based on a value in another fieldâÂÂ.
â G-Man
6 hours ago
(1)â¯IâÂÂm amazed that a trivial question like this can accumulate five edits (by five different people), six upvotes, no downvotes, and no closeâ¯votes (after approximately 7â¯hours).âÂÂ(2)â¯@MichaelKjörling: Wow, that is the general version of the title?!â When I saw the title âÂÂExtract first column value for line with specific second column value from three-columns file with awkâÂÂ, my first thought was that it should be renamed to âÂÂExtract a field from a line based on a value in another fieldâÂÂ.
â G-Man
6 hours ago
Possible duplicate of filter based on a field value in awk
â G-Man
36 secs ago
Possible duplicate of filter based on a field value in awk
â G-Man
36 secs ago
add a comment |Â
6 Answers
6
active
oldest
votes
up vote
6
down vote
With awk:
$ awk '$2 == "Turtle" print $1' turtle.txt
259497
457032
$2
is the field to select.Turtle
is the text to match.print $1
is to print the first field.turtle.txt
is the name of the source file.
With sed:
$ <infile sed -E 's/[[:blank:]]+/n/g;/([^n]+n)1Turtle/([^n]*).*/1/;p};d'
Explained:
<infile
Source filesed -E
Use sed with POSIX ERE (Extended Regular Expresions)'s/[[:blank:]]+/n/g
Replace all (runs+
) of tab-space with a new line./([^n]+n)1Turtlen/
If fieldn
(usen-1
here) matchTurtle
(exactly).([^n]*).*/1/
Extract field 1 (first line)p};d'
Print what was selected and delete everything in any case.
General solution for any pair of field(s) n
and m
:
<infile sed -E 's/[[:blank:]]+/n/g;/([^n]+n)1Turtle/s/([^n]+n)0([^n]*).*/2/;p;d'
<infile
Source filesed -E '
For sed with ERE regexes.s/[[:blank:]]+/n/g
Break all input into lines at (runs of) tabs or spaces./([^n]+n)1Turtle/
If the pattern space match then
th field (usen-1
(1
) here).Start a sequence of commands.
s/
Start a replace (as///
command).([^n]+n)0
Matchm-1
(0
) lines (for fieldm
).([^n]*)
Capture the field (the line) to keep in backreference2
..*
And match everything else (in the pattern space (the original line))./2/
Replace all of above (The pattern space) with what was captured in2
.;p;
Print it. And close command sequence.d
In any case, delete the pattern space, start again.'
End sed command.
add a comment |Â
up vote
5
down vote
You can use:
awk '$2 == "Turtle" print $1' file
259497
457032
add a comment |Â
up vote
4
down vote
Using sed:
sed -n '/sTurtles/s/^([0-9]+)s.*/1/p' file
Of course this would match âÂÂTurtleâ appearing in any column except for the first or the last.â (Of course, for a three-column file, that does narrow it down to the second column â but it will fail on a line where the third column is missing.)â¯â¯ And, of course, it depends on the ID number being purely numeric.â Some people use things like âÂÂ123.01âÂÂ, âÂÂ456AâÂÂ, âÂÂ78(9)â and âÂÂ987-65-4321â as ID âÂÂnumbersâÂÂ.
â G-Man
6 hours ago
add a comment |Â
up vote
4
down vote
Golfing it:
$ awk '$2=="Turtle"&&$0=$1' <file
259497
457032
Or, expanded in stages until we reach Isaac's and Goro's answers
awk '$2 == "Turtle" && $0 = $1' <file
awk '$2 == "Turtle" $0 = $1; print ' <file
awk '$2 == "Turtle" print $1 ' <file
The three are not exactly equivalent as my golfed code would not print the number if it was zero (the result of $0=$1
is used as a conditional).
Here's a proper sed
solution to make up for the golfing above:
$ sed -n '/<Turtle>/s/[[:blank:]].*//p' <file
259497
457032
It finds all lines containing the word Turtle
and then remowes the first space or tab character and everything after it on those lines before printing them (printing of other lines is inhibited by -n
).
The <
and >
matches word start and end boundaries so that <Turtle>
matches only the string Turtle
and not e.g. RedTurtle
.
The first one won't work properly when the id is zero
â user000001
11 hours ago
1
@user000001 This was already made clear in the answer.
â Kusalananda
11 hours ago
2
But it adds nothing useful IMO. That's more of an example of things not to do (use assignments as conditions inawk
).
â Stéphane Chazelas
11 hours ago
Note that<Turtle>
is not portable and would match on Red-Turtle. You would need something likesed -n 's/^[[:blank:]]*([^[:blank:]]1,)[[:blank:]]1,Turtle([[:blank:]].*)0,1$/1/p'
for a real equivalent.
â Stéphane Chazelas
11 hours ago
@Kusalananda: Also, of course, yoursed
solution would match âÂÂTurtleâ appearing in any column.
â G-Man
6 hours ago
 |Â
show 1 more comment
up vote
3
down vote
non-awk alternative:
grep -w "Turtle" turtle.txt | cut -d " " -f 1
1
But this would match âÂÂTurtleâ (or even something like âÂÂâÂÂTurtle#1998âÂÂâ or âÂÂâÂÂMock-TurtleâÂÂâÂÂ) appearing in any column.
â G-Man
6 hours ago
add a comment |Â
up vote
1
down vote
You may employ grep
in this:
grep -oP '^d+(?=h+Turtleh)'
We expect answers as complex/cryptic as thisâ to include an explanation.
â G-Man
6 hours ago
add a comment |Â
6 Answers
6
active
oldest
votes
6 Answers
6
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
6
down vote
With awk:
$ awk '$2 == "Turtle" print $1' turtle.txt
259497
457032
$2
is the field to select.Turtle
is the text to match.print $1
is to print the first field.turtle.txt
is the name of the source file.
With sed:
$ <infile sed -E 's/[[:blank:]]+/n/g;/([^n]+n)1Turtle/([^n]*).*/1/;p};d'
Explained:
<infile
Source filesed -E
Use sed with POSIX ERE (Extended Regular Expresions)'s/[[:blank:]]+/n/g
Replace all (runs+
) of tab-space with a new line./([^n]+n)1Turtlen/
If fieldn
(usen-1
here) matchTurtle
(exactly).([^n]*).*/1/
Extract field 1 (first line)p};d'
Print what was selected and delete everything in any case.
General solution for any pair of field(s) n
and m
:
<infile sed -E 's/[[:blank:]]+/n/g;/([^n]+n)1Turtle/s/([^n]+n)0([^n]*).*/2/;p;d'
<infile
Source filesed -E '
For sed with ERE regexes.s/[[:blank:]]+/n/g
Break all input into lines at (runs of) tabs or spaces./([^n]+n)1Turtle/
If the pattern space match then
th field (usen-1
(1
) here).Start a sequence of commands.
s/
Start a replace (as///
command).([^n]+n)0
Matchm-1
(0
) lines (for fieldm
).([^n]*)
Capture the field (the line) to keep in backreference2
..*
And match everything else (in the pattern space (the original line))./2/
Replace all of above (The pattern space) with what was captured in2
.;p;
Print it. And close command sequence.d
In any case, delete the pattern space, start again.'
End sed command.
add a comment |Â
up vote
6
down vote
With awk:
$ awk '$2 == "Turtle" print $1' turtle.txt
259497
457032
$2
is the field to select.Turtle
is the text to match.print $1
is to print the first field.turtle.txt
is the name of the source file.
With sed:
$ <infile sed -E 's/[[:blank:]]+/n/g;/([^n]+n)1Turtle/([^n]*).*/1/;p};d'
Explained:
<infile
Source filesed -E
Use sed with POSIX ERE (Extended Regular Expresions)'s/[[:blank:]]+/n/g
Replace all (runs+
) of tab-space with a new line./([^n]+n)1Turtlen/
If fieldn
(usen-1
here) matchTurtle
(exactly).([^n]*).*/1/
Extract field 1 (first line)p};d'
Print what was selected and delete everything in any case.
General solution for any pair of field(s) n
and m
:
<infile sed -E 's/[[:blank:]]+/n/g;/([^n]+n)1Turtle/s/([^n]+n)0([^n]*).*/2/;p;d'
<infile
Source filesed -E '
For sed with ERE regexes.s/[[:blank:]]+/n/g
Break all input into lines at (runs of) tabs or spaces./([^n]+n)1Turtle/
If the pattern space match then
th field (usen-1
(1
) here).Start a sequence of commands.
s/
Start a replace (as///
command).([^n]+n)0
Matchm-1
(0
) lines (for fieldm
).([^n]*)
Capture the field (the line) to keep in backreference2
..*
And match everything else (in the pattern space (the original line))./2/
Replace all of above (The pattern space) with what was captured in2
.;p;
Print it. And close command sequence.d
In any case, delete the pattern space, start again.'
End sed command.
add a comment |Â
up vote
6
down vote
up vote
6
down vote
With awk:
$ awk '$2 == "Turtle" print $1' turtle.txt
259497
457032
$2
is the field to select.Turtle
is the text to match.print $1
is to print the first field.turtle.txt
is the name of the source file.
With sed:
$ <infile sed -E 's/[[:blank:]]+/n/g;/([^n]+n)1Turtle/([^n]*).*/1/;p};d'
Explained:
<infile
Source filesed -E
Use sed with POSIX ERE (Extended Regular Expresions)'s/[[:blank:]]+/n/g
Replace all (runs+
) of tab-space with a new line./([^n]+n)1Turtlen/
If fieldn
(usen-1
here) matchTurtle
(exactly).([^n]*).*/1/
Extract field 1 (first line)p};d'
Print what was selected and delete everything in any case.
General solution for any pair of field(s) n
and m
:
<infile sed -E 's/[[:blank:]]+/n/g;/([^n]+n)1Turtle/s/([^n]+n)0([^n]*).*/2/;p;d'
<infile
Source filesed -E '
For sed with ERE regexes.s/[[:blank:]]+/n/g
Break all input into lines at (runs of) tabs or spaces./([^n]+n)1Turtle/
If the pattern space match then
th field (usen-1
(1
) here).Start a sequence of commands.
s/
Start a replace (as///
command).([^n]+n)0
Matchm-1
(0
) lines (for fieldm
).([^n]*)
Capture the field (the line) to keep in backreference2
..*
And match everything else (in the pattern space (the original line))./2/
Replace all of above (The pattern space) with what was captured in2
.;p;
Print it. And close command sequence.d
In any case, delete the pattern space, start again.'
End sed command.
With awk:
$ awk '$2 == "Turtle" print $1' turtle.txt
259497
457032
$2
is the field to select.Turtle
is the text to match.print $1
is to print the first field.turtle.txt
is the name of the source file.
With sed:
$ <infile sed -E 's/[[:blank:]]+/n/g;/([^n]+n)1Turtle/([^n]*).*/1/;p};d'
Explained:
<infile
Source filesed -E
Use sed with POSIX ERE (Extended Regular Expresions)'s/[[:blank:]]+/n/g
Replace all (runs+
) of tab-space with a new line./([^n]+n)1Turtlen/
If fieldn
(usen-1
here) matchTurtle
(exactly).([^n]*).*/1/
Extract field 1 (first line)p};d'
Print what was selected and delete everything in any case.
General solution for any pair of field(s) n
and m
:
<infile sed -E 's/[[:blank:]]+/n/g;/([^n]+n)1Turtle/s/([^n]+n)0([^n]*).*/2/;p;d'
<infile
Source filesed -E '
For sed with ERE regexes.s/[[:blank:]]+/n/g
Break all input into lines at (runs of) tabs or spaces./([^n]+n)1Turtle/
If the pattern space match then
th field (usen-1
(1
) here).Start a sequence of commands.
s/
Start a replace (as///
command).([^n]+n)0
Matchm-1
(0
) lines (for fieldm
).([^n]*)
Capture the field (the line) to keep in backreference2
..*
And match everything else (in the pattern space (the original line))./2/
Replace all of above (The pattern space) with what was captured in2
.;p;
Print it. And close command sequence.d
In any case, delete the pattern space, start again.'
End sed command.
edited 16 mins ago
answered 14 hours ago
Isaac
7,85711137
7,85711137
add a comment |Â
add a comment |Â
up vote
5
down vote
You can use:
awk '$2 == "Turtle" print $1' file
259497
457032
add a comment |Â
up vote
5
down vote
You can use:
awk '$2 == "Turtle" print $1' file
259497
457032
add a comment |Â
up vote
5
down vote
up vote
5
down vote
You can use:
awk '$2 == "Turtle" print $1' file
259497
457032
You can use:
awk '$2 == "Turtle" print $1' file
259497
457032
edited 14 hours ago
answered 14 hours ago
Goro
7,56753371
7,56753371
add a comment |Â
add a comment |Â
up vote
4
down vote
Using sed:
sed -n '/sTurtles/s/^([0-9]+)s.*/1/p' file
Of course this would match âÂÂTurtleâ appearing in any column except for the first or the last.â (Of course, for a three-column file, that does narrow it down to the second column â but it will fail on a line where the third column is missing.)â¯â¯ And, of course, it depends on the ID number being purely numeric.â Some people use things like âÂÂ123.01âÂÂ, âÂÂ456AâÂÂ, âÂÂ78(9)â and âÂÂ987-65-4321â as ID âÂÂnumbersâÂÂ.
â G-Man
6 hours ago
add a comment |Â
up vote
4
down vote
Using sed:
sed -n '/sTurtles/s/^([0-9]+)s.*/1/p' file
Of course this would match âÂÂTurtleâ appearing in any column except for the first or the last.â (Of course, for a three-column file, that does narrow it down to the second column â but it will fail on a line where the third column is missing.)â¯â¯ And, of course, it depends on the ID number being purely numeric.â Some people use things like âÂÂ123.01âÂÂ, âÂÂ456AâÂÂ, âÂÂ78(9)â and âÂÂ987-65-4321â as ID âÂÂnumbersâÂÂ.
â G-Man
6 hours ago
add a comment |Â
up vote
4
down vote
up vote
4
down vote
Using sed:
sed -n '/sTurtles/s/^([0-9]+)s.*/1/p' file
Using sed:
sed -n '/sTurtles/s/^([0-9]+)s.*/1/p' file
answered 14 hours ago
oliv
1,131210
1,131210
Of course this would match âÂÂTurtleâ appearing in any column except for the first or the last.â (Of course, for a three-column file, that does narrow it down to the second column â but it will fail on a line where the third column is missing.)â¯â¯ And, of course, it depends on the ID number being purely numeric.â Some people use things like âÂÂ123.01âÂÂ, âÂÂ456AâÂÂ, âÂÂ78(9)â and âÂÂ987-65-4321â as ID âÂÂnumbersâÂÂ.
â G-Man
6 hours ago
add a comment |Â
Of course this would match âÂÂTurtleâ appearing in any column except for the first or the last.â (Of course, for a three-column file, that does narrow it down to the second column â but it will fail on a line where the third column is missing.)â¯â¯ And, of course, it depends on the ID number being purely numeric.â Some people use things like âÂÂ123.01âÂÂ, âÂÂ456AâÂÂ, âÂÂ78(9)â and âÂÂ987-65-4321â as ID âÂÂnumbersâÂÂ.
â G-Man
6 hours ago
Of course this would match âÂÂTurtleâ appearing in any column except for the first or the last.â (Of course, for a three-column file, that does narrow it down to the second column â but it will fail on a line where the third column is missing.)â¯â¯ And, of course, it depends on the ID number being purely numeric.â Some people use things like âÂÂ123.01âÂÂ, âÂÂ456AâÂÂ, âÂÂ78(9)â and âÂÂ987-65-4321â as ID âÂÂnumbersâÂÂ.
â G-Man
6 hours ago
Of course this would match âÂÂTurtleâ appearing in any column except for the first or the last.â (Of course, for a three-column file, that does narrow it down to the second column â but it will fail on a line where the third column is missing.)â¯â¯ And, of course, it depends on the ID number being purely numeric.â Some people use things like âÂÂ123.01âÂÂ, âÂÂ456AâÂÂ, âÂÂ78(9)â and âÂÂ987-65-4321â as ID âÂÂnumbersâÂÂ.
â G-Man
6 hours ago
add a comment |Â
up vote
4
down vote
Golfing it:
$ awk '$2=="Turtle"&&$0=$1' <file
259497
457032
Or, expanded in stages until we reach Isaac's and Goro's answers
awk '$2 == "Turtle" && $0 = $1' <file
awk '$2 == "Turtle" $0 = $1; print ' <file
awk '$2 == "Turtle" print $1 ' <file
The three are not exactly equivalent as my golfed code would not print the number if it was zero (the result of $0=$1
is used as a conditional).
Here's a proper sed
solution to make up for the golfing above:
$ sed -n '/<Turtle>/s/[[:blank:]].*//p' <file
259497
457032
It finds all lines containing the word Turtle
and then remowes the first space or tab character and everything after it on those lines before printing them (printing of other lines is inhibited by -n
).
The <
and >
matches word start and end boundaries so that <Turtle>
matches only the string Turtle
and not e.g. RedTurtle
.
The first one won't work properly when the id is zero
â user000001
11 hours ago
1
@user000001 This was already made clear in the answer.
â Kusalananda
11 hours ago
2
But it adds nothing useful IMO. That's more of an example of things not to do (use assignments as conditions inawk
).
â Stéphane Chazelas
11 hours ago
Note that<Turtle>
is not portable and would match on Red-Turtle. You would need something likesed -n 's/^[[:blank:]]*([^[:blank:]]1,)[[:blank:]]1,Turtle([[:blank:]].*)0,1$/1/p'
for a real equivalent.
â Stéphane Chazelas
11 hours ago
@Kusalananda: Also, of course, yoursed
solution would match âÂÂTurtleâ appearing in any column.
â G-Man
6 hours ago
 |Â
show 1 more comment
up vote
4
down vote
Golfing it:
$ awk '$2=="Turtle"&&$0=$1' <file
259497
457032
Or, expanded in stages until we reach Isaac's and Goro's answers
awk '$2 == "Turtle" && $0 = $1' <file
awk '$2 == "Turtle" $0 = $1; print ' <file
awk '$2 == "Turtle" print $1 ' <file
The three are not exactly equivalent as my golfed code would not print the number if it was zero (the result of $0=$1
is used as a conditional).
Here's a proper sed
solution to make up for the golfing above:
$ sed -n '/<Turtle>/s/[[:blank:]].*//p' <file
259497
457032
It finds all lines containing the word Turtle
and then remowes the first space or tab character and everything after it on those lines before printing them (printing of other lines is inhibited by -n
).
The <
and >
matches word start and end boundaries so that <Turtle>
matches only the string Turtle
and not e.g. RedTurtle
.
The first one won't work properly when the id is zero
â user000001
11 hours ago
1
@user000001 This was already made clear in the answer.
â Kusalananda
11 hours ago
2
But it adds nothing useful IMO. That's more of an example of things not to do (use assignments as conditions inawk
).
â Stéphane Chazelas
11 hours ago
Note that<Turtle>
is not portable and would match on Red-Turtle. You would need something likesed -n 's/^[[:blank:]]*([^[:blank:]]1,)[[:blank:]]1,Turtle([[:blank:]].*)0,1$/1/p'
for a real equivalent.
â Stéphane Chazelas
11 hours ago
@Kusalananda: Also, of course, yoursed
solution would match âÂÂTurtleâ appearing in any column.
â G-Man
6 hours ago
 |Â
show 1 more comment
up vote
4
down vote
up vote
4
down vote
Golfing it:
$ awk '$2=="Turtle"&&$0=$1' <file
259497
457032
Or, expanded in stages until we reach Isaac's and Goro's answers
awk '$2 == "Turtle" && $0 = $1' <file
awk '$2 == "Turtle" $0 = $1; print ' <file
awk '$2 == "Turtle" print $1 ' <file
The three are not exactly equivalent as my golfed code would not print the number if it was zero (the result of $0=$1
is used as a conditional).
Here's a proper sed
solution to make up for the golfing above:
$ sed -n '/<Turtle>/s/[[:blank:]].*//p' <file
259497
457032
It finds all lines containing the word Turtle
and then remowes the first space or tab character and everything after it on those lines before printing them (printing of other lines is inhibited by -n
).
The <
and >
matches word start and end boundaries so that <Turtle>
matches only the string Turtle
and not e.g. RedTurtle
.
Golfing it:
$ awk '$2=="Turtle"&&$0=$1' <file
259497
457032
Or, expanded in stages until we reach Isaac's and Goro's answers
awk '$2 == "Turtle" && $0 = $1' <file
awk '$2 == "Turtle" $0 = $1; print ' <file
awk '$2 == "Turtle" print $1 ' <file
The three are not exactly equivalent as my golfed code would not print the number if it was zero (the result of $0=$1
is used as a conditional).
Here's a proper sed
solution to make up for the golfing above:
$ sed -n '/<Turtle>/s/[[:blank:]].*//p' <file
259497
457032
It finds all lines containing the word Turtle
and then remowes the first space or tab character and everything after it on those lines before printing them (printing of other lines is inhibited by -n
).
The <
and >
matches word start and end boundaries so that <Turtle>
matches only the string Turtle
and not e.g. RedTurtle
.
edited 13 hours ago
answered 13 hours ago
Kusalananda
109k14210334
109k14210334
The first one won't work properly when the id is zero
â user000001
11 hours ago
1
@user000001 This was already made clear in the answer.
â Kusalananda
11 hours ago
2
But it adds nothing useful IMO. That's more of an example of things not to do (use assignments as conditions inawk
).
â Stéphane Chazelas
11 hours ago
Note that<Turtle>
is not portable and would match on Red-Turtle. You would need something likesed -n 's/^[[:blank:]]*([^[:blank:]]1,)[[:blank:]]1,Turtle([[:blank:]].*)0,1$/1/p'
for a real equivalent.
â Stéphane Chazelas
11 hours ago
@Kusalananda: Also, of course, yoursed
solution would match âÂÂTurtleâ appearing in any column.
â G-Man
6 hours ago
 |Â
show 1 more comment
The first one won't work properly when the id is zero
â user000001
11 hours ago
1
@user000001 This was already made clear in the answer.
â Kusalananda
11 hours ago
2
But it adds nothing useful IMO. That's more of an example of things not to do (use assignments as conditions inawk
).
â Stéphane Chazelas
11 hours ago
Note that<Turtle>
is not portable and would match on Red-Turtle. You would need something likesed -n 's/^[[:blank:]]*([^[:blank:]]1,)[[:blank:]]1,Turtle([[:blank:]].*)0,1$/1/p'
for a real equivalent.
â Stéphane Chazelas
11 hours ago
@Kusalananda: Also, of course, yoursed
solution would match âÂÂTurtleâ appearing in any column.
â G-Man
6 hours ago
The first one won't work properly when the id is zero
â user000001
11 hours ago
The first one won't work properly when the id is zero
â user000001
11 hours ago
1
1
@user000001 This was already made clear in the answer.
â Kusalananda
11 hours ago
@user000001 This was already made clear in the answer.
â Kusalananda
11 hours ago
2
2
But it adds nothing useful IMO. That's more of an example of things not to do (use assignments as conditions in
awk
).â Stéphane Chazelas
11 hours ago
But it adds nothing useful IMO. That's more of an example of things not to do (use assignments as conditions in
awk
).â Stéphane Chazelas
11 hours ago
Note that
<Turtle>
is not portable and would match on Red-Turtle. You would need something like sed -n 's/^[[:blank:]]*([^[:blank:]]1,)[[:blank:]]1,Turtle([[:blank:]].*)0,1$/1/p'
for a real equivalent.â Stéphane Chazelas
11 hours ago
Note that
<Turtle>
is not portable and would match on Red-Turtle. You would need something like sed -n 's/^[[:blank:]]*([^[:blank:]]1,)[[:blank:]]1,Turtle([[:blank:]].*)0,1$/1/p'
for a real equivalent.â Stéphane Chazelas
11 hours ago
@Kusalananda: Also, of course, your
sed
solution would match âÂÂTurtleâ appearing in any column.â G-Man
6 hours ago
@Kusalananda: Also, of course, your
sed
solution would match âÂÂTurtleâ appearing in any column.â G-Man
6 hours ago
 |Â
show 1 more comment
up vote
3
down vote
non-awk alternative:
grep -w "Turtle" turtle.txt | cut -d " " -f 1
1
But this would match âÂÂTurtleâ (or even something like âÂÂâÂÂTurtle#1998âÂÂâ or âÂÂâÂÂMock-TurtleâÂÂâÂÂ) appearing in any column.
â G-Man
6 hours ago
add a comment |Â
up vote
3
down vote
non-awk alternative:
grep -w "Turtle" turtle.txt | cut -d " " -f 1
1
But this would match âÂÂTurtleâ (or even something like âÂÂâÂÂTurtle#1998âÂÂâ or âÂÂâÂÂMock-TurtleâÂÂâÂÂ) appearing in any column.
â G-Man
6 hours ago
add a comment |Â
up vote
3
down vote
up vote
3
down vote
non-awk alternative:
grep -w "Turtle" turtle.txt | cut -d " " -f 1
non-awk alternative:
grep -w "Turtle" turtle.txt | cut -d " " -f 1
answered 14 hours ago
RobotJohnny
740216
740216
1
But this would match âÂÂTurtleâ (or even something like âÂÂâÂÂTurtle#1998âÂÂâ or âÂÂâÂÂMock-TurtleâÂÂâÂÂ) appearing in any column.
â G-Man
6 hours ago
add a comment |Â
1
But this would match âÂÂTurtleâ (or even something like âÂÂâÂÂTurtle#1998âÂÂâ or âÂÂâÂÂMock-TurtleâÂÂâÂÂ) appearing in any column.
â G-Man
6 hours ago
1
1
But this would match âÂÂTurtleâ (or even something like âÂÂâÂÂTurtle#1998âÂÂâ or âÂÂâÂÂMock-TurtleâÂÂâÂÂ) appearing in any column.
â G-Man
6 hours ago
But this would match âÂÂTurtleâ (or even something like âÂÂâÂÂTurtle#1998âÂÂâ or âÂÂâÂÂMock-TurtleâÂÂâÂÂ) appearing in any column.
â G-Man
6 hours ago
add a comment |Â
up vote
1
down vote
You may employ grep
in this:
grep -oP '^d+(?=h+Turtleh)'
We expect answers as complex/cryptic as thisâ to include an explanation.
â G-Man
6 hours ago
add a comment |Â
up vote
1
down vote
You may employ grep
in this:
grep -oP '^d+(?=h+Turtleh)'
We expect answers as complex/cryptic as thisâ to include an explanation.
â G-Man
6 hours ago
add a comment |Â
up vote
1
down vote
up vote
1
down vote
You may employ grep
in this:
grep -oP '^d+(?=h+Turtleh)'
You may employ grep
in this:
grep -oP '^d+(?=h+Turtleh)'
answered 11 hours ago
Rakesh Sharma
217113
217113
We expect answers as complex/cryptic as thisâ to include an explanation.
â G-Man
6 hours ago
add a comment |Â
We expect answers as complex/cryptic as thisâ to include an explanation.
â G-Man
6 hours ago
We expect answers as complex/cryptic as thisâ to include an explanation.
â G-Man
6 hours ago
We expect answers as complex/cryptic as thisâ to include an explanation.
â G-Man
6 hours ago
add a comment |Â
Kamat is a new contributor. Be nice, and check out our Code of Conduct.
Kamat is a new contributor. Be nice, and check out our Code of Conduct.
Kamat is a new contributor. Be nice, and check out our Code of Conduct.
Kamat is a new contributor. Be nice, and check out our Code of Conduct.
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
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f473978%2fextract-mth-first-column-value-for-line-with-specific-nth-second-column%23new-answer', 'question_page');
);
Post as a guest
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
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
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
1
I'm amazed that this simple question could attract 6 answers so far.
â simlev
11 hours ago
@simlev, the Hot Network Questions algorithm is a mystery; it's contributing to the views & votes here
â Jeff Schaller
11 hours ago
Hi Kamat. I generalized the title of your question. The answer would be the same if this was about, say, a part number / description / price table, so the fact that it's about animals in this case seems inconsequential to answering the question.
â Michael Kjörling
9 hours ago
(1)â¯IâÂÂm amazed that a trivial question like this can accumulate five edits (by five different people), six upvotes, no downvotes, and no closeâ¯votes (after approximately 7â¯hours).âÂÂ(2)â¯@MichaelKjörling: Wow, that is the general version of the title?!â When I saw the title âÂÂExtract first column value for line with specific second column value from three-columns file with awkâÂÂ, my first thought was that it should be renamed to âÂÂExtract a field from a line based on a value in another fieldâÂÂ.
â G-Man
6 hours ago
Possible duplicate of filter based on a field value in awk
â G-Man
36 secs ago