代码: 全选
AAA BBB CCC DDD dd DdDd
类似于 Python 的 line.split(None, N)[-1] 这样子。
代码: 全选
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;
}
\s+分割,cut可以。第一域要求不空,是什么意思,是指^\s+的行全部不操作,还是说^\s+的行你就取从N-1域开始??lilydjwg 写了:Methuselar, 我知道位置,但是域是以 \s+ 分隔的,并且第一个域要求不为空,所以 cut 不行。
ljj_jjl2008, 写得比 Python 还长……
哎,我写的程序,就是用来接受BS的。lilydjwg 写了:Methuselar, 我知道位置,但是域是以 \s+ 分隔的,并且第一个域要求不为空,所以 cut 不行。
ljj_jjl2008, 写得比 Python 还长……
代码: 全选
awk -vPOS=你想要的位置 '{printf $POS;for (i=POS+1;i<=NF;i++) printf " "$i;printf "\n"}'
代码: 全选
awk -vPOS=你想要的位置 '{ ma="^ *"; for (i=1;i<=POS;i++){ ma=ma$i" *";}; sub(ma, "", $0); print $0;}'
对,空格个数要保留。Methuselar 写了:这样往死里作总可以了吧...但如果你需要保留空格的个数, 那就不是这样的情况了.代码: 全选
awk -vPOS=$你想要的位置 '{printf $POS;for (i=POS+1;i<=NF;i++) printf " "$i;printf "\n"}'
cut 怎么做?就是要求去掉 ^\s+ 再分割那样,不要把数据右对齐造成的空格前被当成空的域。Methuselar 写了:\s+分割,cut可以。第一域要求不空,是什么意思,是指^\s+的行全部不操作,还是说^\s+的行你就取从N-1域开始??lilydjwg 写了:Methuselar, 我知道位置,但是域是以 \s+ 分隔的,并且第一个域要求不为空,所以 cut 不行。
ljj_jjl2008, 写得比 Python 还长……
问题是,自己写的程序携带不便啊。我工作时经常得从自己笔记本上拷个把脚本过去……ljj_jjl2008 写了:我其实很讨厌这种讨论:有这种讨论时间,够写200个程序的了。
作成deb包,把依赖的包也顺便下载deb来放在一起。lilydjwg 写了:问题是,自己写的程序携带不便啊。我工作时经常得从自己笔记本上拷个把脚本过去……ljj_jjl2008 写了:我其实很讨厌这种讨论:有这种讨论时间,够写200个程序的了。
那光cut不行, cut是极少数记录分段位置的工具,也就拥有简单的输出第N列以后的所有数据的能力。lilydjwg 写了: cut 怎么做?就是要求去掉 ^\s+ 再分割那样,不要把数据右对齐造成的空格前被当成空的域。
第一个问题我问的是怎么以 \s+ 作为分隔符。去 ^\s+ 我 sed 一下就行了。Methuselar 写了:那光cut不行, cut是极少数记录分段位置的工具,也就拥有简单的输出第N列以后的所有数据的能力。lilydjwg 写了: cut 怎么做?就是要求去掉 ^\s+ 再分割那样,不要把数据右对齐造成的空格前被当成空的域。
awk 没记录,所以不可能简单的做到 cut -d' ' -f3- 那么简单. 我第二个awk里sub的匹配和替换开销极大,当然数据不大(不上G)是无所谓的。
数据大的话, 就用C/Java那样的做法了。
但也正因为那样,cut只能从具体数据获取列数信息
话说, 讨论讨论不也挺好...
lilydjwg 写了:如何获取到DDD dd DdDd呢?代码: 全选
AAA BBB CCC 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 //