很抱歉有一個新手問題,但我有一個看起來像這樣的檔案,想在某個字串 /aggr 之后捕獲一行。
/aggr0_usts_nz_3001/plex0/rg0:
9g.10.0 0 4.08 0.00 .... . 4.08 1.00 41 0.00 .... .
1a.10.1 0 4.08 0.00 .... . 4.08 1.00 10 0.00 .... .
9g.10.4 0 4.08 0.00 .... . 4.08 1.00 49 0.00 .... .
1a.10.1 0 0.00 0.00 .... . 0.00 .... . 0.00 .... .
9g.10.4 0 0.00 0.00 .... . 0.00 .... . 0.00 .... .
/aggr1_usts_nz_3001/plex0/rg0:
1e.00.0 0 0.00 0.00 .... . 0.00 .... . 0.00 .... .
9o.01.44 0 0.00 0.00 .... . 0.00 .... . 0.00 .... .
1e.00.1 4 994.04 994.04 1.44 119 0.00 .... . 0.00 .... .
9o.01.41 4 981.91 981.91 1.41 141 0.00 .... . 0.00 .... .
1e.00.4 4 811.19 811.19 1.14 149 0.00 .... . 0.00 .... .
9o.01.14 4 809.99 809.99 1.14 119 0.00 .... . 0.00 .... .
1e.00.1 4 980.86 980.86 1.19 144 0.00 .... . 0.00 .... .
9o.01.11 4 998.89 998.89 1.11 140 0.00 .... . 0.00 .... .
/aggr1_usts_nz_3001/plex0/rg1:
9a.10.14 0 0.00 0.00 .... . 0.00 .... . 0.00 .... .
9e.40.14 0 0.00 0.00 .... . 0.00 .... . 0.00 .... .
1g.11.14 4 999.10 999.10 1.16 110 0.00 .... . 0.00 .... .
1o.41.14 4 996.90 996.90 1.44 118 0.00 .... . 0.00 .... .
9a.10.11 4 911.11 911.11 1.44 116 0.00 .... . 0.00 .... .
9e.40.11 4 919.48 919.48 1.11 141 0.00 .... . 0.00 .... .
1g.11.11 4 900.44 900.44 1.16 146 0.00 .... . 0.00 .... .
1o.41.11 1 694.19 694.19 1.19 109 0.00 .... . 0.00 .... .
9a.10.14 4 941.44 941.44 1.61 111 0.00 .... . 0.00 .... .
我想在例如 /aggr0 之后取出某行并將其重定向到檔案。所以示例是,file1 將包含此資訊
/aggr0_usts_nz_3001/plex0/rg0:
9g.10.0 0 4.08 0.00 .... . 4.08 1.00 41 0.00 .... .
1a.10.1 0 4.08 0.00 .... . 4.08 1.00 10 0.00 .... .
9g.10.4 0 4.08 0.00 .... . 4.08 1.00 49 0.00 .... .
1a.10.1 0 0.00 0.00 .... . 0.00 .... . 0.00 .... .
9g.10.4 0 0.00 0.00 .... . 0.00 .... . 0.00 .... .
然后 file2 將是此資訊,依此類推。
/aggr1_usts_nz_3001/plex0/rg0:
1e.00.0 0 0.00 0.00 .... . 0.00 .... . 0.00 .... .
9o.01.44 0 0.00 0.00 .... . 0.00 .... . 0.00 .... .
1e.00.1 4 994.04 994.04 1.44 119 0.00 .... . 0.00 .... .
9o.01.41 4 981.91 981.91 1.41 141 0.00 .... . 0.00 .... .
1e.00.4 4 811.19 811.19 1.14 149 0.00 .... . 0.00 .... .
9o.01.14 4 809.99 809.99 1.14 119 0.00 .... . 0.00 .... .
1e.00.1 4 980.86 980.86 1.19 144 0.00 .... . 0.00 .... .
9o.01.11 4 998.89 998.89 1.11 140 0.00 .... . 0.00 .... .
所以這就像隔離檔案上的資訊。
在下面有這個命令,但由于 aggr 之后的行不一樣,它只會顯示定義的內容(即 7)
for i in `cat sample.txt`; do
echo $i | grep aggr* -A 7
done
但它只顯示了我的grepped。
此命令在匹配模式后列印 2 行,但是我想要將其重定向到檔案。
awk '/aggr/{x=NR 2}(NR<=x){print}' sample.txt
任何想法我怎么能完成它。
uj5u.com熱心網友回復:
你可以使用這個awk:
awk '/^\/aggr/ {close(fn); fn = "file" fNo ".txt"} {print > fn}' file
uj5u.com熱心網友回復:
這可能對您有用(GNU csplit):
csplit -n1 -ffile file '/^\/aggr/' '{*}'
這將從您的示例中生成 4 個檔案file0 file1 file2 file3,其中file0為空。如果您不介意從零開始的數字,請使用:
csplit -zn1 -ffile file '/^\/aggr/' '{*}'
這將省略第一個空檔案。
對于使用 bash 的 sed 解決方案:
sed -En '/^\/aggr/!b;x;s/^/1/;x;:a;H;$!{n;/^\/aggr/!ba};x
s/^(\S )\n(.*)/echo "\2" > file\1;echo $((\1 1))/e;x;$!ba' file
本質上 - 這會在保持空間中收集檔案的拆分,并在遇到下一個拆分或檔案末尾時將其寫出。
當第一次拆分作為保持空間的第一行時,檔案號被準備好,并且在寫出拆分后,檔案號也使用標準 bash 演算法遞增并替換保持空間的內容。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/439462.html
上一篇:替換檔案名bash中的部分字串
