두 개의 다른 파일이 있습니다. 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을 편집하라고 지시합니다.
- 2번째 줄에서는 명령의 출력을 읽고 다음 줄
head -10 file2
에 삽입합니다. w
파일을 쓰다q
그것에 의해 편집됨
GNU sed 사용( e
확장 사용, 쉘 명령을 통해 입력을 파이프함):
sed -i '3e head -10 file2' file1
file2를 반복하는 확장 솔루션
아래 스크립트는 file1에 있는 블록 수 만큼 아이디어를 for
반복하는 루프 입니다. 루프를 통과할 때마다 세 가지 항목을 계산합니다.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