当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 31 篇帖子 ]  前往页数 1, 2, 3  下一页
作者 内容
1 楼 
 文章标题 : 获取第N个域及其之后的内容?
帖子发表于 : 2012-08-23 13:22 
头像

注册: 2009-04-11 23:46
帖子: 4130
系统: Arch Linux
送出感谢: 11
接收感谢: 124
代码:
  AAA BBB     CCC         DDD dd DdDd

如何获取到DDD dd DdDd呢?
类似于 Python 的 line.split(None, N)[-1] 这样子。


_________________
我的博客 https://blog.lilydjwg.me/
提问的智慧
Arch Linux 中文论坛

我的vimrc: https://git.io/vimrc


页首
 用户资料  
 
2 楼 
 文章标题 : Re: 获取第N个域及其之后的内容?
帖子发表于 : 2012-08-23 13:28 
头像

注册: 2007-09-16 8:29
帖子: 14253
送出感谢: 172
接收感谢: 272
这是我写过的一个函数,获得字符串第n段内容的。
不能直接解决你的问题,可以作为参考。
代码:
int get_str2(char * jg,char *fullstr,int n_id)
{
    char f_buffer[4096],ch2[4096];
    int i,n,o,p,yh;
    sprintf(f_buffer,"%s",fullstr);
    p=0;
    i=0;
    while (1)
    {
        o=0;
        yh=0;
        for (n=0;n<4096;n++)
            ch2[n]='\0';
        for (n=p;n<4096;n++)
        {
            if ((yh==0) and (f_buffer[n]==' '))
                continue;
    //                                printf("%c\n",f_buffer[n]);
            if ((yh==1) and (f_buffer[n]=='\"') and (f_buffer[n-1]!='\\'))
                break;
            if (((f_buffer[n]=='\"') and (n==p)) or ((f_buffer[n]=='\"') and (n>p) and (f_buffer[n-1]!='\\')))
            {
                yh=1;
                continue;
            }
            if ((yh==2) and (f_buffer[n]==' '))
                break;
            if ((yh==0) and (f_buffer[n]!=' '))
                yh=2;
            if (yh>0)
            {
                ch2[o]=f_buffer[n];
                o=o+1;
            }
        }
        if (yh==1)
            p=n+1;
        else
            p=n;
        i=i+1;
        if (i==n_id)
        {
            sprintf(jg,"%s",ch2);
            return 0;
        }
    }
    return -1;
}


_________________
闻到死太贵, 麦克价更高。 有了笨笨兔, 二者皆可抛。
+ 我的六轮折腾
+ 折腾6轮的结果(对40余种WM的测试和分析,多种DE和WM并存的方案)
+ 折腾的中间成果:可以独立运行的一个Wharf(图标化的启动菜单)
+ 强烈推荐----折腾的终极成果:一个自己开发的DE环境
+ 签名空闲链接位置招租


页首
 用户资料  
 
3 楼 
 文章标题 : Re: 获取第N个域及其之后的内容?
帖子发表于 : 2012-08-23 13:43 
头像

注册: 2009-06-04 12:06
帖子: 122
送出感谢: 0 次
接收感谢: 3
如果你知道位置:
代码:
cut -d' ' -f4-


如果你知道需要去掉的字符:
代码:
sed 's/AAA\ \+BBB\ \+CCC\ \+//'


_________________
Mea Culpa!


页首
 用户资料  
 
4 楼 
 文章标题 : Re: 获取第N个域及其之后的内容?
帖子发表于 : 2012-08-23 14:26 
头像

注册: 2009-04-11 23:46
帖子: 4130
系统: Arch Linux
送出感谢: 11
接收感谢: 124
Methuselar, 我知道位置,但是域是以 \s+ 分隔的,并且第一个域要求不为空,所以 cut 不行。
ljj_jjl2008, 写得比 Python 还长……


_________________
我的博客 https://blog.lilydjwg.me/
提问的智慧
Arch Linux 中文论坛

我的vimrc: https://git.io/vimrc


页首
 用户资料  
 
5 楼 
 文章标题 : Re: 获取第N个域及其之后的内容?
帖子发表于 : 2012-08-23 15:22 
头像

注册: 2009-06-04 12:06
帖子: 122
送出感谢: 0 次
接收感谢: 3
lilydjwg 写道:
Methuselar, 我知道位置,但是域是以 \s+ 分隔的,并且第一个域要求不为空,所以 cut 不行。
ljj_jjl2008, 写得比 Python 还长……


\s+分割,cut可以。第一域要求不空,是什么意思,是指^\s+的行全部不操作,还是说^\s+的行你就取从N-1域开始??


_________________
Mea Culpa!


页首
 用户资料  
 
6 楼 
 文章标题 : Re: 获取第N个域及其之后的内容?
帖子发表于 : 2012-08-23 15:23 
头像

注册: 2007-09-16 8:29
帖子: 14253
送出感谢: 172
接收感谢: 272
lilydjwg 写道:
Methuselar, 我知道位置,但是域是以 \s+ 分隔的,并且第一个域要求不为空,所以 cut 不行。
ljj_jjl2008, 写得比 Python 还长……

哎,我写的程序,就是用来接受BS的。


_________________
闻到死太贵, 麦克价更高。 有了笨笨兔, 二者皆可抛。
+ 我的六轮折腾
+ 折腾6轮的结果(对40余种WM的测试和分析,多种DE和WM并存的方案)
+ 折腾的中间成果:可以独立运行的一个Wharf(图标化的启动菜单)
+ 强烈推荐----折腾的终极成果:一个自己开发的DE环境
+ 签名空闲链接位置招租


页首
 用户资料  
 
7 楼 
 文章标题 : Re: 获取第N个域及其之后的内容?
帖子发表于 : 2012-08-23 15:55 
头像

注册: 2009-06-04 12:06
帖子: 122
送出感谢: 0 次
接收感谢: 3
这样往死里作总可以了吧...
代码:
awk -vPOS=你想要的位置 '{printf $POS;for (i=POS+1;i<=NF;i++) printf " "$i;printf "\n"}'


但如果你需要保留空格的个数, 那就不是这样的情况了. awk可以动态生成正则:

代码:
awk -vPOS=你想要的位置 '{ ma="^ *"; for (i=1;i<=POS;i++){ ma=ma$i" *";}; sub(ma, "", $0); print $0;}'


_________________
Mea Culpa!


最后由 Methuselar 编辑于 2012-08-23 17:49,总共编辑了 1 次

页首
 用户资料  
 
8 楼 
 文章标题 : Re: 获取第N个域及其之后的内容?
帖子发表于 : 2012-08-23 16:43 
头像

注册: 2009-04-11 23:46
帖子: 4130
系统: Arch Linux
送出感谢: 11
接收感谢: 124
Methuselar 写道:
这样往死里作总可以了吧...
代码:
awk -vPOS=$你想要的位置 '{printf $POS;for (i=POS+1;i<=NF;i++) printf " "$i;printf "\n"}'


但如果你需要保留空格的个数, 那就不是这样的情况了.

对,空格个数要保留。
Methuselar 写道:
lilydjwg 写道:
Methuselar, 我知道位置,但是域是以 \s+ 分隔的,并且第一个域要求不为空,所以 cut 不行。
ljj_jjl2008, 写得比 Python 还长……


\s+分割,cut可以。第一域要求不空,是什么意思,是指^\s+的行全部不操作,还是说^\s+的行你就取从N-1域开始??

cut 怎么做?就是要求去掉 ^\s+ 再分割那样,不要把数据右对齐造成的空格前被当成空的域。


_________________
我的博客 https://blog.lilydjwg.me/
提问的智慧
Arch Linux 中文论坛

我的vimrc: https://git.io/vimrc


页首
 用户资料  
 
9 楼 
 文章标题 : Re: 获取第N个域及其之后的内容?
帖子发表于 : 2012-08-23 16:44 
头像

注册: 2009-04-11 23:46
帖子: 4130
系统: Arch Linux
送出感谢: 11
接收感谢: 124
我还是自己写个程序吧哎。


_________________
我的博客 https://blog.lilydjwg.me/
提问的智慧
Arch Linux 中文论坛

我的vimrc: https://git.io/vimrc


页首
 用户资料  
 
10 楼 
 文章标题 : Re: 获取第N个域及其之后的内容?
帖子发表于 : 2012-08-23 16:45 
头像

注册: 2007-09-16 8:29
帖子: 14253
送出感谢: 172
接收感谢: 272
我其实很讨厌这种讨论:有这种讨论时间,够写200个程序的了。


_________________
闻到死太贵, 麦克价更高。 有了笨笨兔, 二者皆可抛。
+ 我的六轮折腾
+ 折腾6轮的结果(对40余种WM的测试和分析,多种DE和WM并存的方案)
+ 折腾的中间成果:可以独立运行的一个Wharf(图标化的启动菜单)
+ 强烈推荐----折腾的终极成果:一个自己开发的DE环境
+ 签名空闲链接位置招租


页首
 用户资料  
 
11 楼 
 文章标题 : Re: 获取第N个域及其之后的内容?
帖子发表于 : 2012-08-23 16:55 
头像

注册: 2009-04-11 23:46
帖子: 4130
系统: Arch Linux
送出感谢: 11
接收感谢: 124
ljj_jjl2008 写道:
我其实很讨厌这种讨论:有这种讨论时间,够写200个程序的了。

问题是,自己写的程序携带不便啊。我工作时经常得从自己笔记本上拷个把脚本过去……


_________________
我的博客 https://blog.lilydjwg.me/
提问的智慧
Arch Linux 中文论坛

我的vimrc: https://git.io/vimrc


页首
 用户资料  
 
12 楼 
 文章标题 : Re: 获取第N个域及其之后的内容?
帖子发表于 : 2012-08-23 16:59 
头像

注册: 2007-09-16 8:29
帖子: 14253
送出感谢: 172
接收感谢: 272
lilydjwg 写道:
ljj_jjl2008 写道:
我其实很讨厌这种讨论:有这种讨论时间,够写200个程序的了。

问题是,自己写的程序携带不便啊。我工作时经常得从自己笔记本上拷个把脚本过去……

作成deb包,把依赖的包也顺便下载deb来放在一起。


_________________
闻到死太贵, 麦克价更高。 有了笨笨兔, 二者皆可抛。
+ 我的六轮折腾
+ 折腾6轮的结果(对40余种WM的测试和分析,多种DE和WM并存的方案)
+ 折腾的中间成果:可以独立运行的一个Wharf(图标化的启动菜单)
+ 强烈推荐----折腾的终极成果:一个自己开发的DE环境
+ 签名空闲链接位置招租


页首
 用户资料  
 
13 楼 
 文章标题 : Re: 获取第N个域及其之后的内容?
帖子发表于 : 2012-08-23 17:36 
头像

注册: 2009-06-04 12:06
帖子: 122
送出感谢: 0 次
接收感谢: 3
lilydjwg 写道:
cut 怎么做?就是要求去掉 ^\s+ 再分割那样,不要把数据右对齐造成的空格前被当成空的域。


那光cut不行, cut是极少数记录分段位置的工具,也就拥有简单的输出第N列以后的所有数据的能力。
awk 没记录,所以不可能简单的做到 cut -d' ' -f3- 那么简单. 我第二个awk里sub的匹配和替换开销极大,当然数据不大(不上G)是无所谓的。
数据大的话, 就用C/Java那样的做法了。

但也正因为那样,cut只能从具体数据获取列数信息

话说, 讨论讨论不也挺好...


_________________
Mea Culpa!


页首
 用户资料  
 
14 楼 
 文章标题 : Re: 获取第N个域及其之后的内容?
帖子发表于 : 2012-08-23 17:47 
头像

注册: 2009-04-11 23:46
帖子: 4130
系统: Arch Linux
送出感谢: 11
接收感谢: 124
Methuselar 写道:
lilydjwg 写道:
cut 怎么做?就是要求去掉 ^\s+ 再分割那样,不要把数据右对齐造成的空格前被当成空的域。


那光cut不行, cut是极少数记录分段位置的工具,也就拥有简单的输出第N列以后的所有数据的能力。
awk 没记录,所以不可能简单的做到 cut -d' ' -f3- 那么简单. 我第二个awk里sub的匹配和替换开销极大,当然数据不大(不上G)是无所谓的。
数据大的话, 就用C/Java那样的做法了。

但也正因为那样,cut只能从具体数据获取列数信息

话说, 讨论讨论不也挺好...


第一个问题我问的是怎么以 \s+ 作为分隔符。去 ^\s+ 我 sed 一下就行了。
我今天用的那个方法调用 Python,写了十来行呢……哦,它同时把 uniq -c 的活也干了。


_________________
我的博客 https://blog.lilydjwg.me/
提问的智慧
Arch Linux 中文论坛

我的vimrc: https://git.io/vimrc


页首
 用户资料  
 
15 楼 
 文章标题 : Re: 获取第N个域及其之后的内容?
帖子发表于 : 2012-08-27 14:04 

注册: 2008-10-31 22:12
帖子: 6546
系统: 践兔
送出感谢: 18
接收感谢: 25
lilydjwg 写道:
代码:
  AAA BBB     CCC         DDD dd DdDd

如何获取到DDD dd DdDd呢?
类似于 Python 的 line.split(None, N)[-1] 这样子。

代码:
● echo '  AAA BBB     CCC         DDD dd DdDd'|awk -F' +' '{for (i=5;i<=NF;i++){printf $i " ";}}'
DDD dd DdDd %


_________________
代码:
] ls -ld //


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 31 篇帖子 ]  前往页数 1, 2, 3  下一页

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 3 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译