【问题标题】:linux: extract pattern from filelinux:从文件中提取模式
【发布时间】:2015-04-27 17:06:06
【问题描述】:

我有一个 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 ,应该更合适
  • sed 和 awk 在 linux 上都是一种惯用的方式

标签: linux awk sed


【解决方案1】:

我认为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 模式时打印该列。

【讨论】:

  • 我认为@kent 的回答要好得多。
  • 如果模式总是在第 4 列也是我选择的选项,@Kent 为 +1
【解决方案2】:

现在我想从这个文件中提取所有以 '参考|'。 这种模式只存在于 col4

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

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

输出:

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

【讨论】:

  • 我刚刚注意到这一点,并想更新我自己的答案。
【解决方案3】:

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

awk '{print $4}' < data.txt | sed -e 's/,/\n/g' | grep "^ref"

【讨论】:

    【解决方案4】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-07
      • 1970-01-01
      相关资源
      最近更新 更多