linux:从文件中提取模式

时间:2015-04-27 08:02:35

标签: linux awk sed

我有一个大的制表符分隔的4列的.txt文件

col1    col2    col3    col4
name1   1       2       ens|name1,ccds|name2,ref|name3,ref|name4
name2   3       10      ref|name5,ref|name6
...     ...     ...     ...

现在我想从这个文件中提取以' ref |'开头的所有内容。此模式仅存在于col4

因此,对于此示例,我希望将其作为输出

ref|name3
ref|name4
ref|name5
ref|name6

我想过使用' sed'为此,但我不知道从哪里开始。

4 个答案:

答案 0 :(得分:5)

我认为awk更适合这项任务:

$ awk  '{for (i=1;i<=NF;i++){if ($i ~ /ref\|/){print $i}}}' FS='( )|(,)' infile
ref|name3
ref|name4
ref|name5
ref|name6

FS='( )|(,)'FS,设置多列blank spaces到列的列,然后在找到ref模式时打印列。

答案 1 :(得分:4)

  

现在我想从这个文件中提取所有开头的内容   &#39; REF |&#39 ;. 此模式仅出现在col4

如果您确定该模式仅存在于col4中,则可以使用grep:

grep -o 'ref|[^,]*' file

输出:

ref|name3
ref|name4
ref|name5
ref|name6

答案 2 :(得分:2)

我的一个解决方案是首先使用awk来获取第4列,然后使用sed将逗号转换为换行符,然后使用grep(或{{1}再次)获取以awk开头的那些:

ref

答案 3 :(得分:0)

这可能适合你(GNU sed):

sed 's/\(ref|[^,]*\),/\n\1\n/;/^ref/P;D' file

按换行符绕所需的字符串,只打印那些以所需字符串开头的行。