linux: 从文件中提取模式

linux: extract pattern from file

我有一个 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',但我不知道从哪里开始。

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

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

FS='( )|(,)' 设置一个 multile FS 以按 ,blank spaces 遍历列,然后在找到 ref 模式时打印该列。

我的一个解决方案是先使用awk只获取第4列,然后使用sed将逗号转换为换行符,然后使用grep(或awk 再次)得到以 ref:

开头的那些
awk '{print }' < data.txt | sed -e 's/,/\n/g' | grep "^ref"

Now I want to extract from this file everything that starts with 'ref|'. This pattern is only present in col4

如果您确定该模式只出现在 col4 中,您可以使用 grep:

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

输出:

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

这可能对你有用 (GNU sed):

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

用换行符包围所需的字符串,并只打印以所需字符串开头的那些行。