我有以下问题。我的文件看起来像这样:
1082016051300000010005690902BCDEΔ0204366221002201612052016-00001274448A
1082016051300000010034397704EDFG10865125102001201626042016-000001028134
1082016051300000010068901401RADJ34835974123112201528042016-000001343290
1082016051300000010068901401RADJ34835974103112201528042016-000000910290
1082016051300000010095474301RADJ13453401102812201525042016-00000208995K
1082016051300000010098429002RADJΤ1052947211312201218042016-000034021290
1032016051300000010095474301RADJ13453401102812201525042016-00000208995K
1032016051300000010098429002RADJΤ1052947211312201218042016-000034021290
我试图在线上的任何地方只打印匹配两种模式的线条。我想只打印匹配两个模式的行,第一个模式是columbs 2:1(08),第二个模式是单词(RAD)。我试过用grep做这个:
grep -o '.[0-1][1-8]*RAD' FILEIN
我得到的唯一回应是FILEIN是一个二进制文件。我也试过了这个:
sed -n '/[0-1][1-8]*RAD/p' FILEIN
但我有一个感觉*没有扩大。我设法通过连续寻找两种模式来实现它,例如:
sed -n '/RAD/p' FILEIN | sed '/^108/p'
这是有效的,但我将用作输入的文件可能是巨大的,我不确定将流传输到另一个是时间效率。有人能帮助我吗? Awk或Perl也很受欢迎。谢谢
答案 0 :(得分:2)
您可以向-a
添加grep
选项,以强制它将文件作为文本读取。
sed
是一种脚本语言;你可以轻松地结合多种条件和行动。
sed -n '/regex1/!d;/regex2/p' files...
(如果第一个正则表达式不匹配,请删除此行并选择下一个。否则,如果它与第二个正则表达式匹配,则打印。)
同样也很容易 - 甚至可能更容易 - 在Awk。
awk '/regex1/ && /regex2/' files...