2つの異なるファイルがあります。Tab
.File 1は次のようになります。
transcr_15824 3.95253441295071 3.99992738843234 3.93880798313547
YML042W 10.3143219248979 10.6898819949325 11.0073811719421
transcr_18545 7.76182774638543 7.25508954643215 7.92562682485731
YCR105W 8.46144110056843 8.30995100411912 8.85470858413405
transcr_18545 7.76182774638543 7.25508954643215 7.92562682485731
YMR325W 6.2822794040082 6.46992587787936 7.00507748994596
ファイル2は次のようになります。
YLR177W 11.321823973245 12.1264440368589 11.7777091957438
YOR117W 10.7514234580732 11.3932687209745 11.2587694561818
TY_120 5.95114867088525 5.93580053538449 5.89166059690558
YMR174C 8.49545850099485 8.72467418433346 9.6518559706269
YPL117C 10.7211879012765 10.5046713289602 10.6145538571844
TY2_LTR_77 11.9297940548212 11.9801206538102 12.049127298122
YOL101C 7.76141097131674 9.89522697916433 7.85466704627526
YLR053C 7.62843998411388 7.49205634213499 7.10263942962051
YBR135W 9.70614244227352 9.3114074341804 9.36413815370247
YNL168C 9.93928326709444 10.3036524361223 10.0704544058998
今やりたいことは、2行の後に10File 2
行を追加することですFile 1
。次のようにする必要があります。
transcr_15824 3.95253441295071 3.99992738843234 3.93880798313547
YML042W 10.3143219248979 10.6898819949325 11.0073811719421
YLR177W 11.321823973245 12.1264440368589 11.7777091957438
YOR117W 10.7514234580732 11.3932687209745 11.2587694561818
TY_120 5.95114867088525 5.93580053538449 5.89166059690558
YMR174C 8.49545850099485 8.72467418433346 9.6518559706269
YPL117C 10.7211879012765 10.5046713289602 10.6145538571844
TY2_LTR_77 11.9297940548212 11.9801206538102 12.049127298122
YOL101C 7.76141097131674 9.89522697916433 7.85466704627526
YLR053C 7.62843998411388 7.49205634213499 7.10263942962051
YBR135W 9.70614244227352 9.3114074341804 9.36413815370247
YNL168C 9.93928326709444 10.3036524361223 10.0704544058998
transcr_18545 7.76182774638543 7.25508954643215 7.92562682485731
YCR105W 8.46144110056843 8.30995100411912 8.85470858413405
だから基本的に、各間にすでに存在する行を維持しながら、File 2
各間に10行を移動しようとします。transcr_
transcr_
編集する:
File 2
約2,000行があり、File 1
約200本の「transcr_」行があります。したがって、次のようになります。最初の10行をFile 2
取得し、最初と2番目の「transcr_」行の間に配置します(これら2つの「transcr_」行の間にすでに存在する行の後に配置します。次に、11から20までの行を取得File 2
し、 3番目の「transcr_」の間に入れて、21から30までの行を取得し、File 2
3番目と4番目の「transcr_」の間に入れます。
次のように見えます。
transcr_1
already existing line
10 first lines from `File 2`
transcr_2
already existing line
Lines 11-20 from `File 2`
transcr_3
already existing line
Lines 21-30 from `File 2`
transcr_4
.....
答え1
あなたはそれを使用することができますed
!
ed -s file1 <<< $'2r !head -10 file2\nw\nq'
これは、edに3つのコマンドを使用してfile1を編集するように指示します。
- 2行目はコマンドの出力を読み取り、次の行
head -10 file2
に挿入します。 w
ファイルを書き込むq
それによって編集されました
GNU sedを使用する(e
拡張を使用する、シェルコマンドを介して入力をパイプする):
sed -i '3e head -10 file2' file1
file2を繰り返す拡張ソリューション
以下のスクリプトは、file1のブロック数だけアイデアをfor
繰り返すループです。ループを通過するたびに3つの項目を計算します。ed
transcr_
ed
file1で読み込みを開始する行番号sed
file2で読み込みを開始する行番号sed
file2で読み取りを停止する行番号
項目1の綴りはとしてより明確です。10*(N-1) + 2*N
に単純化しました12*N - 10
。
10*(N-1) + 1
項目#2と#3はthroughとしてより明確にスペルを使用しましたが10*N
、私はjust 10*N - 9
throughに単純化しました10*N
。
私はこのコマンドをfile2から行ブロックを選択するためのhead
より柔軟で強力なコマンドに置き換えました。sed
times
これにより、ループ内でfile1回書き換えられます。
# how many times we need to insert blocks
times=$(grep -c transcr_ file1)
for((index=1;index <= times; index++));
do
printf "%dr !sed -n %d,%dp file2\nw\nq\n" $((12 * index - 10)) $((10 * index - 9)) $(( 10 * index )) |
ed -s file1
done