我是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包含所有三个变量而没有任何其他冗余数据
谢谢
答案 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|....