Chinaunix

标题: sed和awk [打印本页]

作者: baby_神    时间: 2016-01-14 21:52
标题: sed和awk
本帖最后由 baby_神 于 2016-01-14 21:52 编辑

1、打印文件奇数行
sed -n 'p;n'
sed 'n;d'
sed -n '$!N;P'
sed -n '1~2p'
awk 'i=!i'
awk 'NR%2'
2、打印文件偶数行
sed -n 'n;p'
sed -n '0~2p'
awk '!(i=!i)'
awk '!(NR%2)'
3、打印文件倒数第二行
sed -n 'N;$P;D'
awk '{a[NR]=$0}END{print a[NR-1]}'
awk '{a=b;b=$0}END{print a}'
4、文件顺序倒过来(模拟tac)
sed '1!G;h;$!d'
awk '{a[NR]=$0}END{for(i=NR;i>=1;i--)print a}'
5、文件奇偶行换位置
sed -n 'h;$!{n;G};p'
awk 'getline i{print i}1'
awk 'i=NR%2{x=$0;next}{print $0 RS x}END{if(i)print x}'
6、把列变为行
sed ':t;N;s/\n/ /g;tt'
awk '{printf("%s ",$0)}'

大家还有其他好玩的么,共享下
作者: jason680    时间: 2016-01-14 22:29
回复 1# baby_神

3、打印文件倒数第二行
awk '{a[NR%2]=$0}END{print a[--NR%2]}'
倒数第n行
awk '{a[NR%n]=$0}END{print a[(NR-n+1)%n]}'
   
作者: baby_神    时间: 2016-01-14 22:52
你这个思路很特别,有点理解不了,能稍微点一下么?
回复 2# jason680


   
作者: jason680    时间: 2016-01-14 23:06
本帖最后由 jason680 于 2016-01-14 23:08 编辑

回复 3# baby_神

倒数第n行
数组 [ ] [ ] .... [ ] [ ]  n个

ex: NR=10行, n=4(倒数第4行)

END时 NR%4=2
a[1], a[2], a[3], a[4]
NR%4 =2
a[倒数第2行], a[倒数第1行], a[倒数第4行], a[倒数第3行]
a[第9行],       a[第10行],     a[第7行],       a[第8行]

$ seq 10 | awk -vn=4 '{a[NR%n]=$0}END{print a[(NR+1)%n]}'
7

     

作者: baby_神    时间: 2016-01-14 23:22
明白了,学习了,大赞
回复 4# jason680


   
作者: yjh777    时间: 2016-01-15 10:03
ed 方法:
倒数第N行:
    echo -e "-$((N-1))\nq\n" |ed -s <(seq 10)
作者: yjh777    时间: 2016-01-15 10:06
最后N行

[yjh@ss ~]$ N=4
[yjh@ss ~]$ echo -e "-$((N-1)),$ p\nq\n" |ed -s <(seq 10)
7
8
9
10

作者: baby_神    时间: 2017-04-29 00:05
本帖最后由 baby_神 于 2017-05-10 16:20 编辑

awk 打印匹配行的前几行;模拟grep -B
seq 7 | awk '/5/{b=NR}{a[NR]=$0}END{for(i=3;i--;i>0)print a[b-i]}'
seq 7 | awk '{a[NR]=$0}/5/{b=NR;exit}END{for(i=3;i--;i>0)print a[b-i]}'

作者: baby_神    时间: 2017-04-29 00:31
sed打印匹配行的前几行怎么写


作者: 1cpuer    时间: 2017-04-29 05:39
回复 7# yjh777

-S;N;p;q; ????
help echo
echo --help
没有看到S;N;p;q 参数

作者: baby_神    时间: 2017-05-10 16:13
本帖最后由 baby_神 于 2017-05-10 16:14 编辑

sed 版打印匹配行的前几行
seq 10 | sed -rn '/8/{x;G;p};H;g;s@(.*\n)*((.*\n){1}.*$)@\2@;h'

seq 10 | sed -n '/\n/{x;bb};1h;1!H;4,${x;D};:b;/8/{g;p}'

seq 10 | sed -n '1h;1!H;4,${x;s/[^\n]\+\n//;x};/8/{g;p}'
作者: baby_神    时间: 2017-06-06 22:08
本帖最后由 baby_神 于 2017-06-06 22:11 编辑

1、逆时针矩阵
  1. awk -vN=1000 'BEGIN{n = (int(sqrt(N) / 2) - sqrt(N) / 2) ? (int(sqrt(N) / 2) + 1) : (int(sqrt(N) / 2));for(i = 1;i <= 2 * n;i++){for(j = 1;j <= 2 * n;j++){if(j + i - 1 < 2 * n){r = (j >= i) ? (n - i + 1) : (n - j + 1);v = (j >= i) ? (4 * (n - i)^2 - j - i + 2 * n + 1) : (4 * (n - j)^2 - 3 * j + i + 2 * n + 1);} else {r = (j <= i) ? (i - n) : (j - n);v = (j <= i) ? (4 * (i - n - 1)^2 + j + 5 * i - 6 * n - 3) : (4 * (j - n - 1)^2 + 7 * j - i - 6 * n - 3)}srand(r);printf("\033["(30 + int(1 + 9 * rand()))"m%4s\033[m", (v > N) ? "" : v);}print ""}}'
复制代码
2、
  1. echo 15|awk '{x=8;for(i=1;i<$0;i++){for(j=1;j<=3*($0-i)-(x>0?x:0);j++)printf" ";for(k=i;k>=1;k--)printf"%d ",k;for(l=2;l<=i;l++)printf"%d ",l;printf"\n";x--};for(i=1;i<=$0;i++){for(j=1;j<=(i<=$0-10+1?3*(i-1):3*(i-1)+2-(i-$0%10-10*int(($0-10)/10)));j++)printf" ";for(k=$0-i+1;k>=1;k--)printf"%d ",k;for(l=2;l<=$0-i+1;l++)printf"%d ",l;printf"\n"}}
复制代码



作者: sditmaner    时间: 2017-06-07 11:28
sed打印匹配行的前几行怎么写
作者: baby_神    时间: 2018-09-18 15:01
sed 打印文件内容并清空文件
  1. [root@test-01 ~]# seq 5 > b              
  2. [root@test-01 ~]# sed '${p;s/.*/:>b/e;d}' b
  3. 1
  4. 2
  5. 3
  6. 4
  7. 5
  8. [root@test-01 ~]# cat b
  9. [root@test-01 ~]#
  10. [root@test-01 ~]#
复制代码

作者: baby_神    时间: 2019-12-30 10:00
  1. seq 9 | sed -nr 'N;s/\n(.*)/ \1\n\1/;P;D'
  2. seq 9 | awk 'NR>1{print a,$0}{a=$0}'
  3. 1 2
  4. 2 3
  5. 3 4
  6. 4 5
  7. 5 6
  8. 6 7
  9. 7 8
  10. 8 9
复制代码





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