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
用换行符包围所需的字符串,并只打印以所需字符串开头的那些行。
我有一个 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
用换行符包围所需的字符串,并只打印以所需字符串开头的那些行。