UNIX在特定列中搜索用户指定的代码并输出整行

时间:2018-02-12 22:50:06

标签: bash unix

我正在开发一个搜索药物清单并根据用户要求返回报告的程序。所以我试图在此列表中搜索用户输入的代码,然后返回相关信息。

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

当我搜索文件时,我只希望它返回该行,如果它在第6-12列(第一行为6314)中找到匹配,但此时它将返回两行,因为第二行也包含6314。我看到的所有答案都使用了文本处理实用程序,如awk,sed或perl,以及程序的其中一个条件是不使用任何这些实用程序。

节目预期输出:

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

我目前得到的是什么:

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

所以它也显示有关第二种药物的信息,因为6314也包含在剂量列中。

2 个答案:

答案 0 :(得分:1)

仅使用尝试此操作:

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

仅在药物专栏中搜索。

解释

${line%% *}

是一个bash 参数扩展,它只保留第一个空格之前的第一个'word'

答案 1 :(得分:1)

使用bash

要匹配6314,但仅当它仅使用bash从第6列开始时,请尝试:

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

这将逐个读取文件中的行。只有当该行与正则表达式^.{5}6314匹配时,该行才会回显输出,该正则表达式要求从行首开始的第六个字符处出现6314

仅打印该行的第二个单词,但仅当第一个单词与您的数字位置6匹配时:

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

使用grep

要匹配6314,但仅当它在第6列中开始时,请尝试:

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

此处,^指定行的开头,.{5}匹配任意五个字符。因此^.{5}6314匹配6314,但仅当它作为第六个字符开始时才行。

使用awk

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

在这里,substr($0, 6, 4)从第六行开始从行中选择四个字符。如果这等于6314,则打印该行。

使用sed

$ sed -En '/^.{5}6314/p' infile
commA6314   ifosfamide  30
除非我们明确要求,否则

-n告诉sed不要打印。 /^.{5}6314/p告诉sed打印从第六个字符开始,匹配6314的任何行。