我正在开发一个搜索药物清单并根据用户要求返回报告的程序。所以我试图在此列表中搜索用户输入的代码,然后返回相关信息。
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也包含在剂量列中。
答案 0 :(得分:1)
仅使用bash尝试此操作:
while read -r line; do
[[ ${line%% *} == *6314* ]] && echo "$line"
done < input_file
仅在药物专栏中搜索。
${line%% *}
是一个bash 参数扩展,它只保留第一个空格之前的第一个'word'
答案 1 :(得分:1)
要匹配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
要匹配6314,但仅当它在第6列中开始时,请尝试:
$ grep -E '^.{5}6314' infile
commA6314 ifosfamide 30
此处,^
指定行的开头,.{5}
匹配任意五个字符。因此^.{5}6314
匹配6314,但仅当它作为第六个字符开始时才行。
$ awk '"6314" == substr($0, 6, 4)' infile
commA6314 ifosfamide 30
在这里,substr($0, 6, 4)
从第六行开始从行中选择四个字符。如果这等于6314
,则打印该行。
$ sed -En '/^.{5}6314/p' infile
commA6314 ifosfamide 30
除非我们明确要求,否则 -n
告诉sed不要打印。 /^.{5}6314/p
告诉sed打印从第六个字符开始,匹配6314
的任何行。