用外壳脚本中的另一个文本文件替换特定的行



i有一个单个asterixes的文件。我有4个文本文件,每个文件中有两行。我想为每个文本文件创建一个新文件,其中行号i 2和i 3被文本文件的内容取代。例如:

文件1将是:

1 5 7 8  
2 4 5 6  

我想将其转换为:

1 5 7 8  
2 4 5 6  
*  
*  
*  
*  
*  
*  

和file2将从:

转换
6 5 6 7  
8 9 0 9  

to:

*  
*  
6 5 6 7  
8 9 0 9  
*  
*  
*  
*  

是否有一种方法可以通过目录中的文本文件进行迭代,将每个文本文件如上所述转换?

谢谢!

更新:也许这会更好地解释:

基本上,我有n个文本文件,每个文件只有两个数字。我想循环浏览文本文件,将每个文本文件转换为一个有n x 2行的文本文件,第一个文本文件的值占据了第1行&2,其余的行是 *。第二个文本文件将具有n x 2行,但是第三行和第4行是文件值,其余为 *。具有N x 2行的第三个文件,带有6&第七行被其值填充,休息为 *,依此类推。

不确定如何轻松地在外壳中执行此操作,但是GNU AWK具有某些使其非常简单的功能。

parse.awk

BEGINFILE { 
  outfile = ARGV[ARGIND] ".new"
  for(i=1; i<ARGIND; i++)
    print "*n*" > outfile
} 
{ print > outfile }
ENDFILE { 
  for(i=1; i<ARGC-ARGIND; i++) 
    print "*n*" > outfile
  close(outfile)
}

这样运行:

gawk -f parse.awk File*

解释

argv是一个数组,并保存输入文件的名称。argind是当前正在处理的文件中的argv索引,argc是argv的长度,即给出的参数数。

开始/完成文件处理时,开始执行启动文件和端帧块,因此在您的情况下它们方便。

bash解决方案:

n=8
i=0
for file in * ; do 
    { 
        for ((a=0 ; a<n ; a++)) ; do
            ((a==i)) && cat "$file"
            echo $'*n*'
        done
    } > "$file".out
    let i++
done

相关内容

  • 没有找到相关文章

最新更新