bash - 用另一个文件的每一行填充文本文件中的空白行
问题描述
所以基本上我有一个包含很多空行的文本文件。我们称它为time.txt,该文件的一部分如下所示:
1 5 20
2 5 12
1 6 3
2 6 4
1 10 30
2 10 21
1 11 27
2 12 8
1 11 34
2 12 20
1 10 30
2 10 21
现在,我有另一个文件,名为location.txt ,它包含的行数与time.txt中的空白行数相同。它看起来像这样:
110 -7 5.000 66
110 -7 5.000 99
110 -7 5.000 60
我想要的实际上很简单:我只想用 location.txt 中的每一行填充 time.txt 中的空白行,给出预期的结果:
110 -7 5.000 66
1 5 20
2 5 12
1 6 3
2 6 4
110 -7 5.000 99
1 10 30
2 10 21
1 11 27
2 12 8
1 11 34
2 12 20
110 -7 5.000 60
1 10 30
2 10 21
我解决这个问题的方法是逐行读取location.txt,将每一行存储在循环中的一个变量中,然后使用 awk 检测time.txt中的空行并将其替换为存储的循环变量。我的代码如下所示:
time="time.txt"
location="location.txt"
while read -r lines_locs; do
awk '!NF{$0=$lines_locs}1' $time
done < "$location"
但这只会在我的屏幕上打印出time.txt而没有进行任何替换。另外,与预期的行数相比,我打印的行数过多。我确定我遗漏了一些东西,如果有人能指出这一点,我会很高兴。
解决方案
一个在 awk 中使用getline
:
$ awk -v file="$location" 'NF==0{if((getline < file)<=0)$0=""}1' "$time"
解释:
$ awk -v file="$location" ' # location file as parameter
NF==0 { # NF==0 considers bare space records empty
if((getline < file)<=0) # when empty read from another file. if failure
$0="" # reset the record. see comments for discussion
}1' "$time" # output
输出:
110 -7 5.000 66
1 5 20
2 5 12
1 6 3
2 6 4
110 -7 5.000 99
1 10 30
2 10 21
1 11 27
2 12 8
1 11 34
2 12 20
110 -7 5.000 60
1 10 30
2 10 21
如果文件location
用完记录,脚本将打印空记录。相关讨论见评论。
推荐阅读
- reactjs - TextInput 右侧的 React-Native 图标
- javascript - 多种模式与一种可覆盖模式
- java - JAVA:您的 SQL 语法错误;检查与您的 MySQL 服务器版本相对应的手册
- java - 局域网共享数据库的 Java Swing 程序
- pixi.js - Pixi.js - 如何为线条制作动画
- flutter - 仅当图像在视口内时才加载图像
- random - 调用 rand-int 到变量中
- django - 如何在 Django Rest Framework 中为“HyperlinkedIdentityField”正确设置“lookup_field”?
- ios - 在 Azure Pipelines 中签署 iOS Flutter 应用程序
- angular - Nativescript Angular Google 地图 - 无法读取未定义的属性“地图”