shell脚本实现将文件中的几行输出合并成一行显示


shell脚本实现将文件中的几行输出合并成一行显示

现在有一个文件aa.txt ,其实现格式如下,而我想实现的结果是192.168.1.17 down

[root@localhost shell]# cat aa.txt
192.168.1.17
down
192.168.1.103
open
192.168.1.221
open
192.168.1.104
down
192.168.1.175
down
192.168.1.112
open
192.168.1.11
down

[root@localhost shell]# awk ‘{if (NR%2==0){print $0} else {printf”%s “,$0}}’ aa.txt
192.168.1.17 down
192.168.1.103 open
192.168.1.221 open
192.168.1.104 down
192.168.1.175 down
192.168.1.112 open
192.168.1.11 down

或者

[root@localhost shell]# cat aa.txt | awk ‘{if(NR%2!=0)ORS=” “;else ORS=”\n”;print}’
192.168.1.17 down
192.168.1.103 open
192.168.1.221 open
192.168.1.104 down
192.168.1.175 down
192.168.1.112 open
192.168.1.11 down

 

先说一下适用的场景,市场部那边希望看到某些商品中“黄牛”用户的活动情况,以及“黄牛”使用代金券的情况,然后发一个excel文件过来,拿到文件先复制到notepad++中,格式类似:

id name  price
1 name1  price1
2 name2  price2
3 name3  price3
4 name4  price4
5 name5  price5
6 name6  price6
7 name7  price7
8 name8  price8
9 name9  price9

查询的时候根据ID查询,所以要把所有的ID组织到一行中,并写成(1,2...,8,9)的格式,这需要做如下件事:

第一,删除第一行标题,sed '1d' ids.txt  ;

第二,只显示第一列, awk -F'\t' '{print $1}'  ;

第三,把第一列以逗号分隔,tr '\n' ',' ;

第四,把第三步中的结果前后加上左右括号,sed 's/^/(/'。

把这四步组在一起,执行:sed '1d' ids.txt | awk -F'\t' '{print $1}' | tr '\n' ',' | sed 's/,$/);/' | sed 's/^/(/' > ok.txt

就得到了(1,2,3,4,5,6,7,8,9);

然后再写个sql和这个文件拼接上就OK了。此处对于数据量小的时候效果不明显,当处理几千万数据,一个文本有几个G的时候,

Linux强大的处理文本的功能就显示出来了。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM