如何将文件 (file2) 中的 10 行添加到另一个文件 (file1) 的 2 行之后?

如何将文件 (file2) 中的 10 行添加到另一个文件 (file1) 的 2 行之后?

我有两个不同的文件,以Tab.文件 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 2File 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扩展,它通过 shell 命令传输输入):

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

扩展解决方案,迭代 file2

下面的脚本是一个for循环,它重复该ed想法的次数与transcr_file1 中的块的数量相同。每次循环时,我们都会计算三项:

  1. ed从 file1 开始读取的行号
  2. sed从 file2 开始读取的行号
  3. sed停止从 file2 读取的行号

第 1 项更清楚地拼写为:10*(N-1) + 2*N,我将其简化为12*N - 10

项目 #2 和 #3 被更清楚地拼写为10*(N-1) + 1through 10*N,我将其简化为10*N - 9through 10*N

head用更灵活、更强大的sed命令替换了该命令,用于从 file2 中挑选行块。

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

相关内容