码迷,mamicode.com
首页 > 其他好文 > 详细

老男孩教育每日一题-2017年3月25日-将一个文本的奇数行和偶数行合并

时间:2017-04-11 00:05:36      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:awk函数   awk内置变量   合并行   

[root@oldboyedu ~]# cat oldboy.txt
48 Oct 3bc1997 lpas 68.00 lvx2a 138
484 Jan 380sdf1 usp 78.00 deiv 344
483 nov 7pl1998 usp 37.00 kvm9d 644
320 aug der9393 psh 83.00 wiel 293
231 jul sdf9dsf sdfs 99.00 werl 223
230 nov 19dfd9d abd 87.00 sdiv 230
219 sept 5ap1996 usp 65.00 lvx2c 189
216 Sept 3zl1998 usp 86.00 kvm9e 234

 

 

  • 方法一:sed版本

[root@show awkfile]# sed ‘N;s#\n# #g‘ 0324-join.txt
48 Oct 3bc1997 lpas 68.00 lvx2a 138 484 Jan 380sdf1usp 78.00 deiv 344
483 nov 7pl1998 usp 37.00 kvm9d 644 320 aug der9393psh 83.00 wiel 293
231 jul sdf9dsf sdfs 99.00 werl 223 230 nov 19dfd9dabd 87.00 sdiv 230
219 sept 5ap1996 usp 65.00 lvx2c 189 216 Sept3zl1998 usp 86.00 kvm9e 234

N表示读取下一行,给sed处理,也就是sed同时处理2行。

  • 方法二:xargs初级版

[root@show awkfile]# xargs -n14 <0324-join.txt
48 Oct 3bc1997 lpas 68.00 lvx2a 138 484 Jan 380sdf1usp 78.00 deiv 344
483 nov 7pl1998 usp 37.00 kvm9d 644 320 aug der9393psh 83.00 wiel 293
231 jul sdf9dsf sdfs 99.00 werl 223 230 nov 19dfd9dabd 87.00 sdiv 230
219 sept 5ap1996 usp 65.00 lvx2c 189 216 Sept3zl1998 usp 86.00 kvm9e 234

有点玩赖了,每一行都是7列,那么两行在一起就是14列了。

  • 方法三:xargs升级版

[root@show awkfile]# xargs -d "\n" -n2<0324-join.txt
48 Oct 3bc1997 lpas 68.00 lvx2a 138 484 Jan 380sdf1usp 78.00 deiv 344
483 nov 7pl1998 usp 37.00 kvm9d 644 320 aug der9393psh 83.00 wiel 293
231 jul sdf9dsf sdfs 99.00 werl 223 230 nov 19dfd9dabd 87.00 sdiv 230
219 sept 5ap1996 usp 65.00 lvx2c 189 216 Sept3zl1998 usp 86.00 kvm9e 234

xargs默认使用的是空格为分隔符,通过-d指定新的分隔符,这里修改为\n回车换行为分隔符。

-n2表示以回车为换行符后,我要每行显示两列,也就是两行。

相当于实现了合并奇偶行的作用。

 

  • 方法三:awk方法

[root@show awkfile]# awk  ‘{lastline=$0;getline;print lastline,$0}‘0324-join.txt
48 Oct 3bc1997 lpas 68.00 lvx2a 138 484 Jan 380sdf1usp 78.00 deiv 344
483 nov 7pl1998 usp 37.00 kvm9d 644 320 aug der9393psh 83.00 wiel 293
231 jul sdf9dsf sdfs 99.00 werl 223 230 nov 19dfd9dabd 87.00 sdiv 230
219 sept 5ap1996 usp 65.00 lvx2c 189 216 Sept3zl1998 usp 86.00 kvm9e 234

getline是读取下一行的意思。

把当前行存放起来,放到lastline变量中。然后读取下一行,然后使用print lastline$0显示上一行和当前行的内容。

  • 方法四:awk-getline升级版

[root@show awkfile]# awk ‘{getline lastline;printlastline,$0}‘ 0324-join.txt
484 Jan 380sdf1 usp 78.00 deiv 344 48 Oct 3bc1997lpas 68.00 lvx2a 138
320 aug der9393 psh 83.00 wiel 293 483 nov 7pl1998usp 37.00 kvm9d 644
230 nov 19dfd9d abd 87.00 sdiv 230 231 jul sdf9dsfsdfs 99.00 werl 223
216 Sept 3zl1998 usp 86.00 kvm9e 234 219 sept5ap1996 usp 65.00 lvx2c 189

awkgetline表示读取下一行。

同时他还有多种形式,getlinelastline ##表示,把下一行的内容放入变量lastline中。

然后通过printlastline,$0输出 #表示输出lastline的内容(上一行的内容)和$0(当前行的内容)

小缺点:

此方法会忽略文件的第一行。

 

  • 方法五:paste-sd参数

[root@show awkfile]# paste -sd " \n"0324-join.txt
48 Oct 3bc1997 lpas 68.00 lvx2a 138 484 Jan 380sdf1usp 78.00 deiv 344
483 nov 7pl1998 usp 37.00 kvm9d 644 320 aug der9393psh 83.00 wiel 293
231 jul sdf9dsf sdfs 99.00 werl 223 230 nov 19dfd9dabd 87.00 sdiv 230
219 sept 5ap1996 usp 65.00 lvx2c 189 216 Sept3zl1998 usp 86.00 kvm9e 234

说明:

paste平时主要用于合并两个文件的内容。

这里通过-s参数可以把一个或多个文件的内容,第一行连接上第二行,连接第三行,。。。。这样的形式放在一起。

组合成一行!注意加上-s后会把文件变为一行。

例子:

[

root@show awkfile]# cat 0324-join.txt
48 Oct 3bc1997 lpas 68.00 lvx2a 138
484 Jan 380sdf1 usp 78.00 deiv 344
483 nov 7pl1998 usp 37.00 kvm9d 644
320 aug der9393 psh 83.00 wiel 293
231 jul sdf9dsf sdfs 99.00 werl 223
230 nov 19dfd9d abd 87.00 sdiv 230
219 sept 5ap1996 usp 65.00 lvx2c 189
216 Sept 3zl1998 usp 86.00 kvm9e 234
[root@show awkfile]# paste -s 0324-join.txt |cat -n
     1  48 Oct 3bc1997 lpas 68.00 lvx2a 138 484 Jan 380sdf1 usp 78.00 deiv 344  483 nov 7pl1998 usp 37.00 kvm9d 644 320 aug der9393 psh 83.00 wiel 293  231 jul sdf9dsf sdfs 99.00 werl 223 230 nov 19dfd9d abd 87.00 sdiv 230  219 sept 5ap1996 usp 65.00 lvx2c 189    216 Sept 3zl1998 usp 86.00 kvm9e 234

注意:cat -n是为了给结果加上个行号。

不难发现,结果就一行。这是-s参数的作用。

继续看-d参数

-d参数可以指定,paste输出的时候每一行以什么"结束"(或者叫分隔符)

-d " \n"表示第一行以空格结束,第二行以回车结束,第三行以空格结束,第四行以回车结束,等等。

 

  • 方法六:

[root@show awkfile]# paste -d " " - -<0324-join.txt
48 Oct 3bc1997 lpas 68.00 lvx2a 138 484 Jan 380sdf1usp 78.00 deiv 344
483 nov 7pl1998 usp 37.00 kvm9d 644 320 aug der9393psh 83.00 wiel 293
231 jul sdf9dsf sdfs 99.00 werl 223 230 nov 19dfd9dabd 87.00 sdiv 230
219 sept 5ap1996 usp 65.00 lvx2c 189 216 Sept3zl1998 usp 86.00 kvm9e 234

说明:

通过man paste不难发现,paste也支持 通过 - 来读取文件。

一个-减号简单可以理解为文件的一行。

paste -d " " - - <filename

表示

每次读取文件的两行,第一行的结束标记为空格。

  • 方法七:判断奇偶行并显示

[root@show awkfile]# awk ‘{if(NR%2==0) print $0;else printf $0" "}‘ 0324-join.txt
48 Oct 3bc1997 lpas 68.00 lvx2a 138 484 Jan 380sdf1usp 78.00 deiv 344
483 nov 7pl1998 usp 37.00 kvm9d 644 320 aug der9393psh 83.00 wiel 293
231 jul sdf9dsf sdfs 99.00 werl 223 230 nov 19dfd9dabd 87.00 sdiv 230
219 sept 5ap1996 usp 65.00 lvx2c 189 216 Sept3zl1998 usp 86.00 kvm9e 234

单独判断奇偶行,如果是奇数行就显示内容,如果是偶数行显示内容但是不输出回车(printf实现)。

  • 方法八:判断奇偶行显示-升级版

[root@show awkfile]# awk ‘{printfNR%2?$0:$0"\n"}‘  0324-join.txt
48 Oct 3bc1997 lpas 68.00 lvx2a 138484 Jan 380sdf1usp 78.00 deiv 344
483 nov 7pl1998 usp 37.00 kvm9d 644320 aug der9393psh 83.00 wiel 293
231 jul sdf9dsf sdfs 99.00 werl 223230 nov 19dfd9dabd 87.00 sdiv 230
219 sept 5ap1996 usp 65.00 lvx2c 189216 Sept3zl1998 usp 86.00 kvm9e 234

三目运算符,相当于上面的ifelse的内容。

 

  • 方法九:awk判断方法

[root@show awkfile]# awk‘NR%2==1{line=$0;next}{print line,$0}‘ 0324-join.txt
48 Oct 3bc1997 lpas 68.00 lvx2a 138 484 Jan 380sdf1usp 78.00 deiv 344
483 nov 7pl1998 usp 37.00 kvm9d 644 320 aug der9393psh 83.00 wiel 293
231 jul sdf9dsf sdfs 99.00 werl 223 230 nov 19dfd9dabd 87.00 sdiv 230
219 sept 5ap1996 usp 65.00 lvx2c 189 216 Sept3zl1998 usp 86.00 kvm9e 234

next表示结束处理当前行的内容,处理下一行。

注意如果执行了next后,后面{}的内容不会执行。

 

  • 方法十:awk内置变量方法

[root@show awkfile]# awk‘ORS=NR%2==0?"\n":" "‘ 0324-join.txt
48 Oct 3bc1997 lpas 68.00 lvx2a 138 484 Jan 380sdf1usp 78.00 deiv 344
483 nov 7pl1998 usp 37.00 kvm9d 644 320 aug der9393psh 83.00 wiel 293
231 jul sdf9dsf sdfs 99.00 werl 223 230 nov 19dfd9dabd 87.00 sdiv 230
219 sept 5ap1996 usp 65.00 lvx2c 189 216 Sept3zl1998 usp 86.00 kvm9e 234

ORS表示输出记录分隔符。

output record separator

简单理解就是控制awk如何显示每行的,在每一行的结尾显示什么。

默认是回车。

这里通过后面的判断来实现了如果是奇数行每一行就以空格结束,如果是偶数行就以回车结束。

相当于下面的例子:

[root@show awkfile]# awk ‘{if(NR%2==0)ORS="\n" ;else ORS=" ";print }‘ 0324-join.txt
48 Oct 3bc1997 lpas 68.00 lvx2a 138 484 Jan 380sdf1usp 78.00 deiv 344
483 nov 7pl1998 usp 37.00 kvm9d 644 320 aug der9393psh 83.00 wiel 293
231 jul sdf9dsf sdfs 99.00 werl 223 230 nov 19dfd9dabd 87.00 sdiv 230
219 sept 5ap1996 usp 65.00 lvx2c 189 216 Sept3zl1998 usp 86.00 kvm9e 234


本文出自 “李导的博客” 博客,请务必保留此出处http://lidao.blog.51cto.com/3388056/1914573

老男孩教育每日一题-2017年3月25日-将一个文本的奇数行和偶数行合并

标签:awk函数   awk内置变量   合并行   

原文地址:http://lidao.blog.51cto.com/3388056/1914573

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!