Chinaunix

标题: 如何补齐使用shell补齐文件 [打印本页]

作者: lovegod1206    时间: 2013-10-17 21:43
标题: 如何补齐使用shell补齐文件
1|2|3|4|5|a
1|2|b
1|2|3|b
1|a
1|2|3|4|a

--->

1|2|3|4|5|a
1|2||||b
1|2|3|||b
1|||||a
1|2|3|4||a


请大侠帮忙使用shell补齐文件,分割符是|,每行字段数为6,如果某行少于6个字段,那么有数字的输出,后面直接加分隔符|,最后一个字段放最后。
作者: lovegod1206    时间: 2013-10-17 21:50
实际文件有几十万,字段有100多个,高手回复下,急。。3Q
作者: yaozhibing41001    时间: 2013-10-17 22:23
本帖最后由 yaozhibing41001 于 2013-10-17 22:25 编辑

回复 2# lovegod1206


高手这个点都睡觉了,只有我们这些菜鸟了,
作者: liion631818    时间: 2013-10-17 22:41

  1. awk -F"|" -vOFS="|" '{t=$NF;$NF="";for(i=1;i<6;i++){printf $i OFS}; print t}'
复制代码

作者: yaozhibing41001    时间: 2013-10-17 22:54
给你来个复杂点的。
  1. [root@localhost ~]# awk -vFS='|'  '{if(NF<6){for(i=1;i<=NF-1;i++){printf $i"|"}{for(l=1;l<=6-i;i++){printf "|"}}print $NF} else {print $0}} ' a
  2. 1|2|3|4|5|a
  3. 1|2||||b
  4. 1|2|3|||b
  5. 1|||||a
  6. 1|2|3|4||a
复制代码

作者: lovegod1206    时间: 2013-10-17 22:58
谢谢,解决了
作者: 关阴月飞    时间: 2013-10-17 23:14
回复 1# lovegod1206
  1. awk -F\| 'FNR==NR{if(NF>a)a=NF;next}a>NF{b=$NF;NF--;for(i=1;i<a;i++)$i=$i;$a=b}1' OFS=\|  urfile urfile
复制代码

作者: WilliBhamlll    时间: 2013-10-17 23:35
  1. awk -F '|' '{for(i=0;i++<NF-1;)a[NR,i]=$i;b[NR]=$NF;l=l<NF?NF:l}END{for(i=0;i++<NR;){for(j=0;j++<l-1;)printf a[i,j]?a[i,j]"|":"|";print b[i]}}' file
复制代码

作者: klainogn    时间: 2013-10-17 23:54
本帖最后由 klainogn 于 2013-10-18 00:17 编辑

awk -F'|' '{a=$NF;$NF="";$0=$1FS$2FS$3FS$4FS$5FS""a}1' a.txt
400万行 10s完成
作者: LikeLx    时间: 2013-10-18 13:36
awk -F "|" '{t=$NF;$NF="";for(i=1;i<6;i++) printf $i"|";print t}'




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2