Unix搜索(grep)

时间:2014-08-18 03:39:13

标签: unix grep

我是unix的新手,我知道在文件中搜索某些单词的命令是通过Grep。

用我的命令

'grep STAR file.txt | grep PTEXT | grep SNUM  > results.txt'

grep命令将返回以下内容,其中包含所有其他详细信息标记以及相同的行。

STAR=20140201 14:01:05|PTEXT=sample1|SUBM=retapp@S01GRETCD1|SBID=retapp|SNUM=232356|....
STAR=20140201 14:02:05|PTEXT=sample2|SUBM=retapp@S01GRETCD1|SBID=retapp|SNUM=556677|...
STAR=20140201 14:03:05|SUBM=retapp@S01GRETCD1|SBID=retapp|SNUM=768764|....
STAR=20140201 14:03:05|PTEXT=sample3|SUBM=retapp@S01GRETCD1|SBID=retapp|SNUM=768764|....

有没有办法得到如下结果:

STAR=20140201 14:01:05|PTEXT=sample1|SNUM=232356|....
STAR=20140201 14:02:05|PTEXT=sample2|SNUM=556677|...
STAR=20140201 14:03:05|PTEXT=sample3|SNUM=768764|....

预期结果:ROWS包含所有三个变量而没有任何其他冗余数据

谢谢

2 个答案:

答案 0 :(得分:2)

使用awk并选择所需的列。将输入和输出字段分隔符设置为|,因为数据由此分隔。拆分线后,只需选择所需的列。 $1将包含column1,$2将包含column2,依此类推......

awk 'BEGIN{FS=OFS="|"}{print $1,$2,$5}' file.txt

如果您不确定哪些列包含您的数据,请使用perl

perl -F'\|' -lane 'print join "|", grep { /STAR|PTEXT|SNUM/ } @F' file.txt

grep内,我们使用简单的正则表达式来匹配三个指定字符串中的任何一个。您可以根据自己的意愿改变它们。

根据新要求进行更新:

perl -F'\|' -lane 'print join "|", grep { /STAR|PTEXT|SNUM/ } @F if /SNUM/ && /PTEXT/ && /STAR/' file.txt

答案 1 :(得分:0)

您似乎正在尝试删除SUBM=SBID=字段。如果是,那么您可以尝试以下perl命令。

$ perl -pe  's/\|SUBM=[^|]*|\|SBID=[^|]*//g' file
STAR=20140201 14:01:05|PTEXT=sample1|SNUM=232356|....
STAR=20140201 14:02:05|PTEXT=sample2|SNUM=556677|...
STAR=20140201 14:03:05|PTEXT=sample3|SNUM=768764|....