使用awk和sed獲取文件奇偶數行的方法總結

 

測試文件test.fileshell

[root@localhost ~]# cat test.file
111111111111111
222222222222222
333333333333333
444444444444444
555555555555555
666666666666666
777777777777777
888888888888888
999999999999999
1010101010101010

1) 打印奇數行的方法bash

[root@localhost ~]# sed -n '1~2p' test.file
111111111111111
333333333333333
555555555555555
777777777777777
999999999999999
 
[root@localhost ~]# sed -n 'p;n' test.file
111111111111111
333333333333333
555555555555555
777777777777777
999999999999999

[root@localhost ~]# sed -n '1,$p;n' test.file
111111111111111
333333333333333
555555555555555
777777777777777
999999999999999

[root@localhost ~]# sed '2~2d' test.file
111111111111111
333333333333333
555555555555555
777777777777777
999999999999999

[root@localhost ~]# awk 'NR%2==1' test.file 
111111111111111
333333333333333
555555555555555
777777777777777
999999999999999
 
[root@localhost ~]# awk 'NR%2' test.file
111111111111111
333333333333333
555555555555555
777777777777777
999999999999999
 
[root@localhost ~]# awk 'i=!i' test.file
111111111111111
333333333333333
555555555555555
777777777777777
999999999999999

2) 打印偶數行的方法測試

[root@localhost ~]# sed -n '2~2p' test.file       
222222222222222
444444444444444
666666666666666
888888888888888
1010101010101010
 
[root@localhost ~]# sed -n 'n;p' test.file
222222222222222
444444444444444
666666666666666
888888888888888
1010101010101010

[root@localhost ~]# sed -n '1,$n;p' test.file
222222222222222
444444444444444
666666666666666
888888888888888
1010101010101010

[root@localhost ~]# sed '1~2d' test.file
222222222222222
444444444444444
666666666666666
888888888888888
1010101010101010

[root@localhost ~]# awk 'NR%2==0' test.file
222222222222222
444444444444444
666666666666666
888888888888888
1010101010101010
 
[root@localhost ~]# awk '!(NR%2)' test.file
222222222222222
444444444444444
666666666666666
888888888888888
1010101010101010
 
[root@localhost ~]# awk '!(i=!i)' test.file
222222222222222
444444444444444
666666666666666
888888888888888
1010101010101010

打印奇偶行的方法總結spa

sed -n '1~2p' test.file   打印奇數行
sed -n '2~2p' test.file   打印偶數行

sed -n 'p;n' test.file    打印奇數行
sed -n 'n;p' test.file    打印偶數行

sed -n '1,$p;n' test.file 打印奇數行
sed -n '1,$n;p' test.file 打印偶數行

sed '2~2d' test.file      打印奇數行
sed '1~2d' test.file      打印偶數行

awk 'NR%2==1' test.file   打印奇數行
awk 'NR%2==0' test.file   打印偶數行

awk 'NR%2' test.file      打印奇數行
awk '!(NR%2)' test.file   打印偶數行

awk 'i=!i' test.file      打印奇數行
awk '!(i=!i)' test.file   打印偶數行

                                                            其餘相關正則取值說明                                                       blog

1) 打印行號和內容
[root@localhost ~]# awk '{print NR":"$0}' test.file 
1:111111111111111
2:222222222222222
3:333333333333333
4:444444444444444
5:555555555555555
6:666666666666666
7:777777777777777
8:888888888888888
9:999999999999999
10:1010101010101010

2) 每行間加一個空行
[root@localhost ~]# awk '1; { print "" }' test.file
111111111111111

222222222222222

333333333333333

444444444444444

555555555555555

666666666666666

777777777777777

888888888888888

999999999999999

1010101010101010


[root@localhost ~]# awk '1 { print } { print "" }' test.file 
111111111111111

222222222222222

333333333333333

444444444444444

555555555555555

666666666666666

777777777777777

888888888888888

999999999999999

1010101010101010

[root@localhost ~]# awk '{ print } { print "" }' test.file
111111111111111

222222222222222

333333333333333

444444444444444

555555555555555

666666666666666

777777777777777

888888888888888

999999999999999

1010101010101010

[root@localhost ~]# awk 'BEGIN { ORS="\n\n" }; 1' test.file
111111111111111

222222222222222

333333333333333

444444444444444

555555555555555

666666666666666

777777777777777

888888888888888

999999999999999

1010101010101010

3) 僅輸出非空行,並每行間在加一個空行
# awk 'NF { print $0 "\n" }' test.file
NF表示當前行的字段數,$0表示當前行,最後再加一個換行

4) 雙倍行距;沒行間兩個空行
默認輸出後會換行的,輸出\n,則會輸出兩個空白行
[root@localhost ~]# awk '1; { print "\n" }' test.file 
111111111111111


222222222222222


333333333333333


444444444444444


555555555555555


666666666666666


777777777777777


888888888888888


999999999999999


1010101010101010


[root@localhost ~]# awk '{ print; print "\n" }' test.file
111111111111111


222222222222222


333333333333333


444444444444444


555555555555555


666666666666666


777777777777777


888888888888888


999999999999999


1010101010101010


5) 顯示當前行在所在文件中的行號
FNR,表示當前行在文件中的行號
[root@localhost ~]# awk '{ print FNR "\t" $0 }' test.file
1       111111111111111
2       222222222222222
3       333333333333333
4       444444444444444
5       555555555555555
6       666666666666666
7       777777777777777
8       888888888888888
9       999999999999999
10      1010101010101010

6) 顯示當前行在本次處理過程當中的行號
NR,表示當前行在本次處理過程當中的行號
[root@localhost ~]# awk '{ print NR "\t" $0 }' test.file
1       111111111111111
2       222222222222222
3       333333333333333
4       444444444444444
5       555555555555555
6       666666666666666
7       777777777777777
8       888888888888888
9       999999999999999
10      1010101010101010

爲啥有FNR和NR的差異呢?效果不都是同樣麼? 
若是使用兩個文件filname1.ext  filname2.ext,則就會看到差異了。
原來:FNR,是每一個文件中的,換了一個文件,會歸零;而NR則每一個文件會累加起來的

7) 使用簡單樣式來輸出
下面表示"行號佔用5位,不足補空格"
[root@localhost ~]# awk '{ printf("] : %s\n", NR, $0) }' test.file 
] : 1
] : 2
] : 3
] : 4
] : 5
] : 6
] : 7
] : 8
] : 9
] : 10

8) 顯示非空行
# awk 'NF { $0=++a " :" $0 }; { print }'   test.file
NF前面說了,表示當前行的行號,此處用他做爲條件,若是是空行,則NF爲0,跳過;不然,用動態變量a存儲非空行的數目

9) 計算行數:效果相似wc -l
END表示每行都處理完了後,在執行,此時NR就是最後一行的行號,也就是總的行數了。
#awk 'END { print NR }'   test.file    

10) 計算每一行的和
s用做每行和的累加,從1到NF(每行總的字段數),依次累加
# awk '{ s = 0; for (i = 1; i <= NF; i++) s = s+$i; print s }'   test.file

11)  計算文件中全部字段的和
s用做總和的累加,每行都處理完成了,再輸出s;注意和10對比,此處沒有每行清零,因此累加了。沒有設置的變量,默認爲空,
可是會根據上下文數值計算狀況自動變爲0
# awk '{ for (i = 1; i <= NF; i++) s = s+$i }; END { print s }'   test.file

12) 將每一個字段用其絕對值代替
$i表示當前行中的字段,$0表示當前行,能夠改變$i的值
# awk '{ for (i = 1; i <= NF; i++) if ($i < 0) $i = -$i; print }'  test.file

13)  計算文件中總的字段和(例如計算單詞數)
# awk '{ total = total + NF }; END { print total }'  test.file

14) 計算匹配指定信息的總行數
# awk '/Linux/ { n++ }; END { print n+0 }'  test.file

15) 找到文件中每行第一個字段中,最大的數,以及其所在的行
用max存儲最大的數,maxline存儲最大數所在的行,並在最後輸出
# awk '$1 > max { max=$1; maxline=$0 }; END { print max, maxline }'  test.file

16) 顯示當前行的字段數,並輸出當前行
# awk '{ print NF ":" $0 } '  test.file

17) 顯示每行最後一個字段的內容
# awk '{ print $NF }'  test.file   #NF表示當前行的字段數,例如爲3,則$NF,就是$3,也就是第三個字段了

18) 顯示最後一行的最後一個字段
每行處理沒有輸出,盡在最後輸出,field做爲每行的最後一行的暫存變量
# awk '{ field = $NF }; END { print field }'  test.file

19) 顯示字段數小於4的行
# awk 'NF < 4'  test.file   

20) 顯示每行的最後一個字段小於4的行
# awk '$NF < 4'  test.file  

                                                            shell腳本,實現奇數行等於偶數行                                                    class

[root@localhost ~]# cat kevin.file
aa
11
bb
22
cc
33
dd
44

使用awk命令能夠這樣實現:
[root@localhost ~]# awk 'NR%2==0{print a"="$0}{a=$0}' kevin.file
aa=11
bb=22
cc=33
dd=44

使用shell腳本能夠這樣實現:
[root@localhost ~]# cat kevin.sh 
#!/bin/bash
n=0
for i in $(cat /root/kevin.file)
do
  n=$(($n+1))
    [ $((n%2)) -eq 1 ] && echo -n $i=
    [ $((n%2)) -eq 0 ] && echo $i
done

[root@localhost ~]# sh kevin.sh
aa=11
bb=22
cc=33
dd=44
相關文章
相關標籤/搜索