免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: 杀无赦
打印 上一主题 下一主题

[文本处理] 请教个管道输入处理的问题 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2014-01-02 09:13 |只看该作者
“‘aaa,bbbb,ccc,ddd' '111,22,3333,4444' '64,128,256,64'  ‘aaa bb cccc dddd , aa bb ccc , aaa bbb , aa bb cc’”
管道里的内容最后一个大段也加上了单引号,这样就好把4个大段分开了,但是大段里面的小段数量是不固定的,可能都是2、3、4、5这样的数量,这个shell还要重新做一下了,多谢大侠们,再给想想办法

论坛徽章:
0
12 [报告]
发表于 2014-01-02 09:18 |只看该作者
这个管道内容准备作为命令的参数使用,四个大段可以是参数$1 $2 $3 $4,外面有个单引号,去掉单引号,使用里面的每列的内容作为一个命令的输入
比如  ls -l  aaa 111 64  aaa bb cccc dddd,类似这样,把每个大段中的第一小段作为参数给命令用,第二小段的给另一个命令用,以此类推

论坛徽章:
1
未羊
日期:2014-01-02 10:31:18
13 [报告]
发表于 2014-01-02 10:25 |只看该作者
我的测试环境是AIX 5.3 没有在Linux下。所以很多的参数选项和函数都不能用。假如你说的只是小段个数不定,而大段一定是四的话。你可以把for循环的次数修改为你小段中出现字段数的最大值,使用动态获取的方式使其具有通用性,但是由于AIX不支持对数组使用length函数,不然可以写成
  1. awk -F"'" '{split($2,A,",");MAX=length(A);split($4,B,",");if(length(B) > MAX) MAX=length(B);split($6,C,",");if(length(C) > MAX) MAX = length(C);split($8,D,",");if(length(D) > MAX) MAX=length(D);for(i=1;i<= MAX;i++) print "A"i"="A[i]"\tB"i"="B[i]"\tC"i"="C[i]"\tD"i"="D[i]}' a
复制代码
如果你的系统也不支持对数组使用length函数的话,你可以把length函数换成等效的方式,反正只要能统计出数组长度即可。其实大段数量也可以不确定,只需要把前面也改成一个for循环即可,每次变量递增2,但是由于我不知道怎么把变量字符串作为split函数的第二个数组名参数,所以就只能写死了。思路就是这样,你把输出改成你想要的格式即可。

论坛徽章:
0
14 [报告]
发表于 2014-01-02 11:20 |只看该作者
不行,我的系统就是AIX,而且最早的方法也不行,取不到参数,结果如下:
A1=     B1=     C1=     D1=
A2=     B2=     C2=     D2=
A3=     B3=     C3=     D3=
A4=     B4=     C4=     D4=

论坛徽章:
0
15 [报告]
发表于 2014-01-02 11:46 |只看该作者
一个自定义函数:
x (){ 。。。。。}  x   ‘aaa,bbbb,ccc,ddd' '111,22,3333,4444' '64,128,256,64'  ‘aaa bb cccc dddd , aa bb ccc , aaa bbb , aa bb cc’

就是这么用,自定义的函数里面引用后面带入的变量,一共4个用单引号括起来的参数集,里面的小段数量是相同的,要么2个、或者3个、4个,把其中的第一列给一组变量,第二列给另一组,以此类推

论坛徽章:
0
16 [报告]
发表于 2014-01-02 15:15 |只看该作者
  _LENGTH=`echo $1 | awk -F"," '{print NF}'`
  echo $_LENGTH
  echo $1 |awk '{split($0,A,",");for( i=1 ; i<=4 ; i++ ) print "A"i"="A[i]"\t"}'
  echo $2 |awk '{split($0,A,",");for(i=1;i<=$_LENGTH;i++) print "B"i"="B[i]"\t"}'
  echo $3 |awk '{split($0,A,",");for(i=1;i<=$_LENGTH;i++) print "C"i"="C[i]"\t"}'
  echo $4 |awk '{split($0,A,",");for(i=1;i<=$_LENGTH;i++) print "D"i"="D[i]"\t"}'
笨办法实现了,每个大段里面的小段个数也算出来了,但是这个个数变量不能替换i<=4为i<=$_LENGTH,总报错,不知道具体应该怎么用,大侠们指点一下
再次感谢huzikan,不厌其烦的解释指点
,

论坛徽章:
1
未羊
日期:2014-01-02 10:31:18
17 [报告]
发表于 2014-01-02 18:48 |只看该作者
回复 16# 杀无赦
  1. awk -F"'" '{LENGTH=split($2,A,",");split($4,B,",");split($6,C,",");split($8,D,","); for(i=1;i<= LENGTH;i++) print "A"i"="A[i]"\tB"i"="B[i]"\tC"i"="C[i]"\tD"i"="D[i]}' urfile
复制代码
无意中在网上看到split函数是会返回其分割出的元素个数的。。所以可以用上面的代码了。LZ试试能不能行,我系统是AIX可以得出结果。


   

论坛徽章:
0
18 [报告]
发表于 2014-01-03 15:36 |只看该作者
本帖最后由 杀无赦 于 2014-01-03 15:38 编辑

echo $2 |awk '{split($0,A,",");for(i=1;i<='$_LENGTH';i++) print "A"i"="A"\t"}'

用单引号将$_LENGTH前后分开,那么$_LENGTH就是shell传进来的变量,就ok了
如果要用awk中的变量,那么eval $(echo $2 |awk '{split($0,A,",");for(i=1;i<='$_LENGTH';i++) print "A"i"="A"\t"}‘)
再来一个while循环:
  i=1
  while [ $i -le $_LENGTH ]
  do
  echo $i
  VA=`eval "echo \$"A${i}""`
  VB=`eval "echo \$"B${i}""`
  VC=`eval "echo \$"C${i}""`
  echo $VA
  ((i=i+1))
  done
里面的变量都可以随你使用

多谢huzikan的一直支持

论坛徽章:
84
每日论坛发贴之星
日期:2015-12-29 06:20:00每日论坛发贴之星
日期:2016-01-16 06:20:00每周论坛发贴之星
日期:2016-01-17 22:22:00程序设计版块每日发帖之星
日期:2016-01-20 06:20:00每日论坛发贴之星
日期:2016-01-20 06:20:00程序设计版块每日发帖之星
日期:2016-01-21 06:20:00每日论坛发贴之星
日期:2016-01-21 06:20:00程序设计版块每日发帖之星
日期:2016-01-23 06:20:00程序设计版块每日发帖之星
日期:2016-01-31 06:20:00数据库技术版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-14 06:20:00
19 [报告]
发表于 2014-01-03 15:42 |只看该作者
read   a  b  c  d  就可以把四段取出来; 然后再用awk处理就很简单了,,
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP