+ -
当前位置:首页 → 问答吧 → awk处理列

awk处理列

时间:2011-04-26

来源:互联网

看讨论的一个问题:

如何把如下文本

172.20.0.9   114.80.92.95   114.80.92.85   114.80.92.39   E4   114.80.92.9

172.20.0.9   114.80.92.39   114.80.92.85   114.80.92.95
转换为:

172.20.0.9   114.80.92.95   114.80.92.85   114.80.92.39   E4   114.80.92.9

172.20.0.9   114.80.92.95   114.80.92.85   114.80.92.39
即第一行和第二行的每列比较,当相同的时候,将他们合并为同一列
之前搞过,忘记咋写了,faint !

作者: expert1   发布时间: 2011-04-26

faint,你好歹给个链接,帮我增加下人气……
http://scmbob.org/luma_s_puzzle.html

作者: xiaopan3322   发布时间: 2011-04-26

本帖最后由 where27 于 2011-04-26 15:43 编辑

看错了。。。

作者: where27   发布时间: 2011-04-26

回复 expert1
  1. awk 'NR==1{for(i=1;i<=NF;i++) {printf $i" ";a[i]=$i;x=NF};print ""}NR==2{for(j=1;j<=x;j++)for(m=1;m<=NF;m++) if($m==a[j]) {printf $m" "}} ' file
复制代码

作者: yinyuemi   发布时间: 2011-04-26

第二行的每一列都能在第一行中找到对应的么?
如果找不到对应的,怎么办?
例如:
172.20.0.9   114.80.92.95   114.80.92.85   114.80.92.39   E4   114.80.92.9

172.20.0.9   114.80.92.85   114.80.92.86   114.80.92.95

作者: ly5066113   发布时间: 2011-04-26

回复 yinyuemi


    :mrgreen:

呵呵,了解了,貌似写的复杂了些。

作者: expert1   发布时间: 2011-04-26

回复 xiaopan3322


    看下人家的疑问,是不是都能找到对应的列?

作者: expert1   发布时间: 2011-04-26

回复 yinyuemi


    awk 'NR==1{for(i=1;i<=NF;i++)a=$i}NR===2{for(i in a){for(j=1;j<=NF;j++)if($j==a)print a}}

前提是,第二行的列一定在第一行中能找到。

作者: expert1   发布时间: 2011-04-26

回复 expert1


更复杂的,明天有时间我再优化下
  1. echo '172.20.0.9   114.80.92.95   114.80.92.85   114.80.92.39   E4   114.80.92.9
  2. 172.20.0.9   114.80.92.39   114.80.92.85   114.80.92.95  x y z' | awk 'NR==1{for(i=1;i<=NF;i++) {printf $i" ";a[i]=$i;x=NF;b[$i]=1};print ""}NR==2{for(j=1;j<=x;j++)for(m=1;m<=NF;m++) {if($m==a[j]) {printf $m" "} else {if(b[$m]!=1){c[$m]}}};for(n in c) printf n" "}'
  3. 172.20.0.9 114.80.92.95 114.80.92.85 114.80.92.39 E4 114.80.92.9
  4. 172.20.0.9 114.80.92.95 114.80.92.85 114.80.92.39 x y z
复制代码

作者: yinyuemi   发布时间: 2011-04-26

条件描述
第一行的长度肯定小于第二行的长度
两行中有相同的值时放在同一列,即同一个域,如果第一行的值,在第二行中没有,则在第二行中用空格代替,如果第二行的值在第一行中没有,则在与第一行匹配完以后,加到末尾
eg:
IN:
a b e f g
c b a g  f k y

OUT:
a b e f g
a b   f g k y

IN:
a b c d e f
h i j k a b c

OUT:
a b c d e f
a b c       h i j k

作者: expert1   发布时间: 2011-04-26