他のファイル(file1)の2行の後にファイル(file2)の10行を追加するにはどうすればよいですか?

他のファイル(file1)の2行の後にファイル(file2)の10行を追加するにはどうすればよいですか?

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 23番目と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を編集するように指示します。

  1. 2行目はコマンドの出力を読み取り、次の行head -10 file2に挿入します。
  2. wファイルを書き込む
  3. qそれによって編集されました

GNU sedを使用する(e拡張を使用する、シェルコマンドを介して入力をパイプする):

sed -i '3e head -10 file2' file1

file2を繰り返す拡張ソリューション

以下のスクリプトは、file1のブロック数だけアイデアをfor繰り返すループです。ループを通過するたびに3つの項目を計算します。edtranscr_

  1. edfile1で読み込みを開始する行番号
  2. sedfile2で読み込みを開始する行番号
  3. sedfile2で読み取りを停止する行番号

項目1の綴りはとしてより明確です。10*(N-1) + 2*Nに単純化しました12*N - 10

10*(N-1) + 1項目#2と#3はthroughとしてより明確にスペルを使用しましたが10*N、私はjust 10*N - 9throughに単純化しました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

関連情報