非常に長いファイルがあります(一部のみ表示されます)。
145 27262253 2093226 747883433 76303046 2.74331
146 27992017 2188217 747883433 76303046 2.8678
147 30385435 2433407 747883433 76303046 3.18913
148 31218703 2514902 747883433 76303046 3.29594
149 33852828 2660530 747883433 76303046 3.48679
150 36161756 2836045 747883433 76303046 3.71682
Alignments 747883433 76303046
Bases 111613795461 11392665612
1 40000373 2754292 838333186 82982133 3.31914
2 35955786 2451917 838333186 82982133 2.95475
3 33056935 2241392 838333186 82982133 2.70105
4 32241895 2172229 838333186 82982133 2.61771
145 29490370 2184347 838333186 82982133 2.63231
146 30252912 2282821 838333186 82982133 2.75098
147 32862262 2544600 838333186 82982133 3.06644
148 33769718 2631164 838333186 82982133 3.17076
149 36673113 2787718 838333186 82982133 3.35942
150 39222287 2975755 838333186 82982133 3.58602
Alignments 838333186 82982133
Bases 125129342261 12391027833
1 35736929 2509527 741319423 80995147 3.09837
2 32185143 2238927 741319423 80995147 2.76427
3 29595482 2043259 741319423 80995147 2.52269
4 28861157 1978254 741319423 80995147 2.44244
空行を一致させたい今後 Alignments
馬と馬そのもの。期待する:
Alignments 747883433 76303046
Alignments 838333186 82982133
可能ですか?他の空の行や単語がたくさんありますAlignments
。私の試み:| awk '{if($1 ~ /^[[:space:]]*Alignments/) {print $0}}'
.しかし、次のようになります。
Alignments 747883433 76303046
Alignments 838333186 82982133
答え1
$ awk '/^$|^Alignments/' input.txt | uniq
Alignments 747883433 76303046
Alignments 838333186 82982133
uniq
超えないようにしてください。一つ行の前、後、間に空白の行がありますAlignments
。
grep
代わりに使用できます。またはsed -n
。またはperl -n
。例えば
$ grep -E '^$|Alignments' input.txt | uniq
答え2
grepを使わないのはなぜですか? :
grep -A1 "^$" file | grep -B1 'Alignments' | grep -v -- "^--$"
答え3
GNU awkを使う:
awk -v RS='\nAlignments[ 0-9]*' '{print RT}' file
レコード区切り文字はRS
期待される一致に設定されRT
(レコード終端)、各レコードについて印刷されます。
答え4
Sedはこれらの仕事に優れています。まず、現在空の場合は、現在の行に次の行を貼り付けます。次に、設定された基準が満たされたら、尋ねて印刷します。
$ sed -ne '
/./!N
/^\nAlignments/p
' file.txt