笑话/linux:awk之RS、ORS与FS、OFS
awk之RSfqtb0V4922oCH、8K7WnP9N4WORS与FS4yTq2、s8136QOFS RSlmsSD:31lhehd1TCraqRRecord Separator15Vx37571274Kk,s5pp8q8g06n记录分隔符 ORSMrj7IO75:B6nJBVO0nOutput Record Separate542Ve,r159Fi输出当前记录分隔符 FS6Z41k:3B7kkQField Separator9a9X4Lp4tsdB,932M7vF字段分隔符 OFSheKh4:kvr2HCxm80b41Out of Field SeparatorVVELX,CG6r4Fh4Y11j输出字段分隔符 PSGlpsY23CcAm93P:WwWUbb2n91RS9Mh56bK4nGYd4、s0M3I9ogoORSUJ6hLQ7nt3U、6XRE95fFS8568N4s、GlIBjPOFS的英文解释绝不是这样的30cUbOC,1Lu4Wa0iSd这里只是解释清楚sSQ3CiM2r。YY4rblz9建议去阅读awk的英文读物j1j8F7Di,WgQ5j7z6其中解释了缩写的含义p9jG25064。Iz3REJJahTNIq1 什么是field(字段)9XxtYlEE6,zab2zQh2P什么是record(记录行)rV128b9?886E3f0F7w6 示例cHeQQs2LsJIOul:lGu8B8n2B0OgK 1.txt i am a student. i like to swim hello moto 1代表第一个记录行0AX5wf1u,1GuvmdAAg5H9dU2代表第二个记录行3SBnS5Gr746i,QhxblKRE9xt3代表第三个记录行e45O03x3oO8uCe。HsI7451az5q50z通过观察我们可以知道总共有3个记录行(record)Ucu57nNjeibvn2。R98tmXF 看看第一行awxse9a0e2X36B:L02nc5lV“i am a student”FD9t7eHbc4,439vWV96ZRs1M这一行的每个单词都是一个字段(field)yP7T0520。45Dv6cY26aUx“i”是一个字段Q95YyYa25tbu9K,PQ8FL“am”是一个字段6V1D1V8kgaT5,92D6w“a”是一个字段8e96l18fnojKv,xRN6x1dGa7“student”是一个字段5cU3Bgzq1x5KI,lS0qwQN588V47该行总共有4个字段R7fP918dsL。KS1f7867b13f RS与ORS RS6k6T2f14:4yAA1TBMwGaeR记录行分隔符 示例5dpXsXK8x2:933609 1.txt a\n b\n c\n d\n e\n 该文本总共有5行ia171Zfy9V3SY1,QR16gl每一行都有一个换行符“\n”yV4eMx4ryN1。rm916kQY6Zi所以每行记录都是以“\n”为一个(换行的)标志t2rSv。eR8dys63Td 可以用一下方法来理解2Y39y2:iE3kTXUw2L 找到某某标志8zDQNu27g3O,4kI1AcSXt让每个某某后的内容重新变成一行 示例 1.txt a|b|c 代码WMSV3luU:jMz60xLrawk 'BEGIN{ RS="|"; } { print $0 }' a b b ORS2uHkhb3:5nJosGW36m可以看成RS的逆向过程 示例 1.txt a b c 可以这样理解P2rfZg2B6iL:85744 观察每一行的“换行符号”d5S8KN5qnh,5UiH2H0e72l432然后将“换行符号”替换成你想要的符号A8R3x5hsM6J。V7i6fIOhXn8S awk 'BEGIN{ ORS="----" }{ print $0 }' 1.txt a----b----c---- FSvNwAYh8ru1h2:fzBAO4pf42字段分隔符 FS默认值为“ (空格)”rzpBv9h,18HVTz如“hello moto”. 在“hello moto”中有一个空格GsaO1950M,136QvIz7x空格就是hello与moto的分隔符(separator)PX6nJzgP3ZLX,CdrwQqFbA而hello与moto就为字段(files)is2hIZ25。JJ79A1OUZTVawk以空格来区分80miR4dm9Tu。AK6Ru1 在看看“i----love----you”6XX1FI9N4R,8zo4aAy如果我们用命令“awk “{ print $1 }””会看到结果为5Rxvs8e6U:0VwK02W i----love----you 如果想打印出三个字母646Qf4L571Uv,kmLgU通过观察可发现“----”为分隔符1LZ593b6Nwis。B83EWCrK5vFE awk 'BEGIN{ FS="----";}{ print $1bx02dY,z2s58l2lq0$2HvLZY0s410,w60zO4CwJ5OY88$3 }' filename i love you OFSsPw3pt4E5PpZg8:O6z8fu0g3输出的字段分隔符QCzxR2W。9LO0T761F19ITS 这么解释吧4KjoO7sXS,3Bx9p如上例中“i----love----you”w7QmdLH9xEs5,Te02usS“----”为分隔符(FS)us8bwCK2u3,4mM52eqa9bQH如果我们想改为用其他符号显示可以这样vbpVpZptN7:ePUE1xI awk 'BEGIN{ FS="----";OFS="*****" }{ print $1MJIOB,4QqXa4$22Q6vA,0tEE733Q185btV$3 }' filename i*****love*****you 其实OFS还有一个例子 echo "abc" | awk '{ OFS="." } { NF=NF; print NFv8nGADg70WA,rqxzCSN06$0}' 结果 1.abc PSmYGR6tXhw0:8Z15N644SDjWRS与ORS可以说成是一个互逆的过程(↔)也可以看成一个替换的过程fA87HH5,b8gIWI但是看成互逆的过程比较好理解176pgTIswkPWV3;Aeyj4h7s14RFS与OFS就是一个替换的过程