我知道如何将单个文本插入到特定间隔。但现在我的问题是,我想将保存在一个文件中的不同文本/单词插入到另一个文件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