首页 > 代码库 > 老男孩教育每日一题-2017年3月25日-将一个文本的奇数行和偶数行合并
老男孩教育每日一题-2017年3月25日-将一个文本的奇数行和偶数行合并
[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
awk中getline表示读取下一行。
同时他还有多种形式,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日-将一个文本的奇数行和偶数行合并