Jesse G
Jesse G

Reputation: 33

UNIX Search in specific column for user specified code and output entire line

I'm working on a program that searches a medication list and returns a report as requested by the user. So i am trying to search this list for a code that the user inputs and then return the relevant information.

EX. (medcode)           (doseage)
commA6314   ifosfamide  30
home5341209 urokinase   6314

When i search the file i only want it to return the line if it finds a match in columns 6-12 (6314 for the first line) but at the moment it will return both lines since the second line also contains 6314. All of the answers i saw used text processing utilities like awk, sed or perl and one of the conditions of the program is not to use any of these utilities.

The programs expected output:

 Enter medication code?
 6314
 See Generic name g/G or Dose d/D?
 g
 ifosfamide

What i am getting currently:

Enter medication code?
6314
See Generic name g/G or Dose d/D?
g
ifosfamide
urokinase

so it is also displaying information about the second medication because 6314 is also contained in the columns for doseage.

Upvotes: 3

Views: 511

Answers (2)

Gilles Quénot
Gilles Quénot

Reputation: 185640

Try this using just :

while read -r line; do
    [[ ${line%% *} == *6314* ]] && echo "$line"
done < input_file

It search only in the medication column.

explanations

${line%% *}

is a bash parameter expansion, it keep only the first 'word' before the first space

Upvotes: 1

John1024
John1024

Reputation: 113944

Using bash

To match 6314 but only if it starts in column 6 using just bash, try:

$ while read -r line; do [[ "$line" =~ ^.{5}6314 ]] && echo "$line"; done <infile
commA6314   ifosfamide  30

This reads lines from the file one-by-one. The line is echoed to output only if it matches the regex ^.{5}6314 which requires that 6314 appear starting at the sixth character from the start of the line.

To print just the second word on the line but only if the first word matches your number position six:

$ while read -r code name extra; do [[ "$code" =~ ^.{5}6314 ]] && echo "$name"; done <infile
ifosfamide

Using grep

To match 6314 but only if it starts in column 6, try:

$ grep -E '^.{5}6314' infile
commA6314   ifosfamide  30

Here, ^ specifies the beginning of a line and .{5} matches any five characters. Thus ^.{5}6314 matches 6314 but only if it starts as the sixth character on the line.

Using awk

$ awk '"6314" == substr($0, 6, 4)' infile
commA6314   ifosfamide  30

Here, substr($0, 6, 4) selects four characters from the line starting at the sixth. If this equals 6314, then the line is printed.

Using sed

$ sed -En '/^.{5}6314/p' infile
commA6314   ifosfamide  30

-n tells sed not to print unless we explicitly ask it to. /^.{5}6314/p tells sed to print any line that, starting at the sixth character, matches 6314.

Upvotes: 1

Related Questions