[英]linux awk and grep specific lines for each datablocks
我有一個文件,共有1000行,由10個數據塊組成。 每個數據塊有100行。 看起來像
....
98
0 -40237.30 16.89 19.51 90.00 90.00 90.00 90.00
Si 1.03311 4.82796 43.16361 1 -342.75159
O 1.83529 2.77329 49.93318 1 -96.97488
O 5.35427 0.19473 46.20120 1 -103.69066
O 2.45071 5.03078 49.23054 1 -99.25241
.....
O 6.14626 12.60099 40.48765 1 -103.96326
O 14.02932 16.70495 49.61010 1 -86.95440
98
50 -40226.57 16.89 19.51 90.00 90.00 90.00 90.00
Si 1.02182 4.80803 43.16740 1 -353.40357
O 1.85563 2.79949 49.91912 1 -96.85369
...
因此它具有兩個標題行和98個數據行。 標題行中的“ 98”表示數據行數。
在這里,我要從每個數據塊中提取5行,分別是第1、11、56、78和92行,並以與原始文件類似的格式打印它們
...
5
O 13.62134 8.31539 48.25986 1 -75.85881
O 9.01739 6.38846 50.60192 1 -2.55755
O 14.76930 15.88060 42.57059 1 -79.24684
Si 7.58364 10.90020 43.49788 1 -348.34842
Si 13.15177 12.05531 40.63252 1 -262.49178
5
O 11.01042 14.50491 45.42672 1 -45.13971
O 3.99057 0.69779 44.08524 1 -147.51776
O 11.84402 0.82791 40.78757 1 -92.14344
Si 4.80766 10.22501 49.57940 1 -297.04787
Si 6.14936 17.03883 40.37907 1 -209.38634
....
像這樣。 grep每條數據線只有5行(第1、11、56、78和92行),並且像上面的示例一樣堆疊。 結果文件總計70行,由10個數據塊組成,每個數據塊有7行(2個標題行+ 5個數據行)
使用'grep'命令對特定行進行grep我沒有問題,但是我不知道如何在數據塊方式中使用grep,並像這樣堆疊。 我當時在想awk和grep的結合,但我不知道。
這應該工作:
awk '
{n = NR%100}
n == 1 || n == 2 || n == 3 || n == 13 || n == 58 || n == 80 || n == 94
' file
這將打印98行塊的第一行和第二行(標題)以及第一行,第11行,第56行,第78行和第92行。
更改標題:
awk '
{n = NR%100}
n == 1 {print "5"; next}
n == 2 || n == 3 || n == 13 || n == 58 || n == 80 || n == 94
' file
盡管awk中的另一種相似方式
由於第一條記錄前有兩個標題行,因此所有數字都是您所說的數字的+2
awk '(NR%100)~/^(3|13|58|80|94)$/' file
(NR%100) If NR%100 (which will effectively loop every 100 from 0-99
~ Contains
^ $ Anchors so that only these exact values are used and not say 12 22 32 etc
| regex or
() a grouping
如果解析參數后沒有塊,則awk中的默認操作是打印,因此,如果參數為true,即mod 100等於任何數字,則將打印該行。
如果要在每個第一條記錄中打印5條(相對於100條)
awk '(x=NR%100)==1{print 5"\n"}x~/^(3|13|58|80|94)$/' file
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.