将不同的文本添加/插入到同一文本文件的特定间隔?

将不同的文本添加/插入到同一文本文件的特定间隔?

我知道如何将单个文本插入到特定间隔。但现在我的问题是,我想将保存在一个文件中的不同文本/单词插入到另一个文件add.txt的特定间隔。data.txt

我想将第一个单词插入add.txt到 的特定位置data.txt,然后将第二个单词添加add.txt到下一个特定位置,依此类推。

我的data.txt包含两列,但插入的单词必须显示为合并行。请参阅下面的示例,了解我需要什么。

add.txt

2001-01-01 00:00:00 42 1
2001-01-02 00:00:00 42 1
2001-01-03 00:00:00 42 1
2001-01-04 00:00:00 42 1
2001-01-05 00:00:00 42 1

data.txt

  -500      11.822788
  -400      12.006394
  -350      12.287062
  -300      12.793395
  -500      11.823597
  -400      12.008012
  -350      12.287062
  -300      12.794204
  -500      11.826023
  -400      12.011247
  -350      12.291915
  -300      12.800675
  -500      11.827641
  -400      12.013674
  -350      12.295959
  -300      12.805528
  -500      11.830067
  -400      12.016100
  -350      12.300003
  -300      12.811998

我想

2001-01-01 00:00:00 42 1 
 -500      11.822788
  -400      12.006394
  -350      12.287062
  -300      12.793395
2001-01-02 00:00:00 42 1
  -500      11.823597
  -400      12.008012
  -350      12.287062
  -300      12.794204
2001-01-03 00:00:00 42 1
  -500      11.826023
  -400      12.011247
  -350      12.291915
  -300      12.800675
2001-01-04 00:00:00 42 1
  -500      11.827641
  -400      12.013674
  -350      12.295959
  -300      12.805528
2001-01-04 00:00:00 42 1
  -500      11.830067
  -400      12.016100
  -350      12.300003
  -300      12.811998

我正在寻找使用 或 之类的最简单的解决awk方案sed

答案1

$ awk '(FNR-1)%4 == 0 { getline add <"add.txt"; print add }; 1' data.txt
2001-01-01 00:00:00 42 1
  -500      11.822788
  -400      12.006394
  -350      12.287062
  -300      12.793395
2001-01-02 00:00:00 42 1
  -500      11.823597
  -400      12.008012
  -350      12.287062
  -300      12.794204
2001-01-03 00:00:00 42 1
  -500      11.826023
  -400      12.011247
  -350      12.291915
  -300      12.800675
2001-01-04 00:00:00 42 1
  -500      11.827641
  -400      12.013674
  -350      12.295959
  -300      12.805528
2001-01-05 00:00:00 42 1
  -500      11.830067
  -400      12.016100
  -350      12.300003
  -300      12.811998

这用于awk读取和输出文件的每一行data.txt。在输出任何第 4 行之前,从文件中读取并输出一行add.txt

不进行检查来验证读取的数据add.txt是否正确读取(如果文件太短,上面的代码将重复最后一行)。


使用paste

$ paste -d '\n' add.txt - - - - <data.txt
2001-01-01 00:00:00 42 1
  -500      11.822788
  -400      12.006394
  -350      12.287062
  -300      12.793395
2001-01-02 00:00:00 42 1
  -500      11.823597
  -400      12.008012
  -350      12.287062
  -300      12.794204
2001-01-03 00:00:00 42 1
  -500      11.826023
  -400      12.011247
  -350      12.291915
  -300      12.800675
2001-01-04 00:00:00 42 1
  -500      11.827641
  -400      12.013674
  -350      12.295959
  -300      12.805528
2001-01-05 00:00:00 42 1
  -500      11.830067
  -400      12.016100
  -350      12.300003
  -300      12.811998

在这里,我要求paste创建记录,其中一行 fromadd.txt作为第一个字段,后跟四行 fromdata.txt作为接下来的四个字段。我-d '\n'将用作字段分隔符的字符设置为换行符。

答案2

如果GNU sed是一个选项,特别是对于 MacOS 上的用户,我们可以运行以下 sed 代码。 GNU 添加的 R 命令和 ~ 命令是这里的关键。

~ 将使 sed 特别查看每第四行,对于其他行,它将传递到标准输出。 R 应从 add.txt 中取出一行并将其与 data.txt 行混合。

$ sed '
    1~4!b
    R add.txt
    $!N
' data.txt

答案3

恕我直言,最简单的方法是将 add.txt 读入数组,然后每 4 行 data.txt 从数组中打印一行:

$ awk 'NR==FNR{a[NR]=$0; next} FNR%4==1{print a[++c]} 1' add.txt data.txt
2001-01-01 00:00:00 42 1
  -500      11.822788
  -400      12.006394
  -350      12.287062
  -300      12.793395
2001-01-02 00:00:00 42 1
  -500      11.823597
  -400      12.008012
  -350      12.287062
  -300      12.794204
2001-01-03 00:00:00 42 1
  -500      11.826023
  -400      12.011247
  -350      12.291915
  -300      12.800675
2001-01-04 00:00:00 42 1
  -500      11.827641
  -400      12.013674
  -350      12.295959
  -300      12.805528
2001-01-05 00:00:00 42 1
  -500      11.830067
  -400      12.016100
  -350      12.300003
  -300      12.811998

相关内容