Unix 使用sed提取特定的分隔字段

Unix 使用sed提取特定的分隔字段,unix,sed,Unix,Sed,学习sed和模式 我的输入行如下所示: 1000001,P00069042,F,0-17,10,A,2,0,3,,,8370 1000001,P00248942,F,0-17,10,A,2,0,1,6,14,15200 1000001,P00087842,F,0-17,10,A,2,0,12,,,1422 1000001,P00085442,F,0-17,10,A,2,0,12,14,,1057 1000002,P00285442,M,55+,16,C,4+,0,8,,,7969 1000003

学习sed和模式

我的输入行如下所示:

1000001,P00069042,F,0-17,10,A,2,0,3,,,8370
1000001,P00248942,F,0-17,10,A,2,0,1,6,14,15200
1000001,P00087842,F,0-17,10,A,2,0,12,,,1422
1000001,P00085442,F,0-17,10,A,2,0,12,14,,1057
1000002,P00285442,M,55+,16,C,4+,0,8,,,7969
1000003,P00193542,M,26-35,15,A,3,0,1,2,,15227
我需要提取第一个、第二个和最后一个字段。第一行的输出类似于

1000001 P00069042 8370
我尝试了sed-n的//、.*、.*、//p',但它只返回第一个和最后一个字段。 我还尝试了
sed-n的/\([^,]*,[^,]*,\).*,//p'
,但它只返回最后一个字段

我的方法是删除第二个逗号和最后一个逗号之间的所有内容,但我不知道如何指定第二个逗号

我知道这可以通过cut或awk来实现,但我正在尝试找出sed。

非常适合非结构化/原始流数据——这不是其中之一。 尽管如此,选择“字段”的诀窍是:

  • 创建一个与整个行匹配的正则表达式
  • 使用捕获组
    \(..\)
    选择要保存的部件
  • 使用
    [^]*
    习惯用法在需要时强制执行非贪婪行为(
    是任意字符)
  • 使用保存的捕获组中的反向引用替换整行

  • 非常适合于非结构化/原始流数据——这不是其中之一。 尽管如此,选择“字段”的诀窍是:

  • 创建一个与整个行匹配的正则表达式
  • 使用捕获组
    \(..\)
    选择要保存的部件
  • 使用
    [^]*
    习惯用法在需要时强制执行非贪婪行为(
    是任意字符)
  • 使用保存的捕获组中的反向引用替换整行


  • 虽然这可能只是一个智力练习,但它是解决问题的错误工具。正如你所说,cut(1)或awk(1)会更简单。虽然它可能只是一个智力练习,但它是解决问题的错误工具。正如你所说,cut(1)或awk(1)会更简单。谢谢你的回答。“$”是做什么的?
    ^
    $
    是。不幸的是,
    ^
    加载过多,当字符类中的第一个字符出现时,否定的含义完全不同,如
    [^]
    谢谢您的回答。“$”是做什么的?
    ^
    $
    是。不幸的是,
    ^
    加载过多,当字符类中的第一个字符出现时,否定的含义完全不同,如
    [^]
    $ echo 1000001,P00069042,F,0-17,10,A,2,0,3,,,8370 |\
        sed 's/^\([^,]*\),\([^,]*\),.*,\(.*\)$/\1 \2 \3/'
    1000001 P00069042 8370