다른 파일(file1)의 2줄 다음에 파일(file2)의 10줄을 어떻게 추가합니까?

다른 파일(file1)의 2줄 다음에 파일(file2)의 10줄을 어떻게 추가합니까?

두 개의 다른 파일이 있습니다. 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행 뒤에 10 File 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와서 첫 번째와 두 번째 "transcr_" 줄 사이에 배치합니다(이 두 "transcr_" 줄 사이에 이미 존재하는 줄 뒤에 배치합니다. 그런 다음 11에서 20까지의 행을 가져 File 2오고 두 번째와 세 번째 "transcr_" 사이에 넣으세요. 그런 다음 21에서 30까지의 행을 가져와서 File 2세 번째와 네 번째 "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에게 세 가지 명령을 사용하여 file1을 편집하라고 지시합니다.

  1. 2번째 줄에서는 명령의 출력을 읽고 다음 줄 head -10 file2에 삽입합니다.
  2. w파일을 쓰다
  3. q그것에 의해 편집됨

GNU sed 사용( e확장 사용, 쉘 명령을 통해 입력을 파이프함):

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

file2를 반복하는 확장 솔루션

아래 스크립트는 file1에 있는 블록 수 만큼 아이디어를 for반복하는 루프 입니다. 루프를 통과할 때마다 세 가지 항목을 계산합니다.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

관련 정보