首页 > 解决方案 > 用另一个文件的每一行填充文本文件中的空白行

问题描述

所以基本上我有一个包含很多空行的文本文件。我们称它为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而没有进行任何替换。另外,与预期的行数相比,我打印的行数过多。我确定我遗漏了一些东西,如果有人能指出这一点,我会很高兴。

标签: bashawkwhile-loop

解决方案


一个在 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用完记录,脚本将打印空记录。相关讨论见评论。


推荐阅读