1

我有一个包含 8 行单个星号的文件。我有 4 个文本文件,每个文件有两行数字。我想为每个文本文件创建一个新文件,其中行号 i+2 和 i+3 被文本文件的内容替换。例如:

File1 将是:

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  

至:

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

有没有办法遍历目录中的文本文件,像上面那样转换每个文本文件?

谢谢!

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

基本上我有 n 个文本文件,每个文件只有两行数字。我想循环浏览文本文件,将每个文本文件转换为另一个文本文件,其中有 nx 2 行,第一个文本文件的值占用第 1 行和第 2 行,其余行是 *. 第二个文本文件将有 nx 2 行,但第 3 和第 4 行是文件值,其余的是 *. 第三个文件有 nx 2 行,第 6 行和第 7 行填充其值,其余为 *,依此类推。

4

2 回答 2

1

不知道如何在 shell 中轻松地做到这一点,但 GNU awk 具有一些使其非常简单的特性。

解析.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 的长度,即给定参数的数量。

BEGINFILE 和 ENDFILE 块在开始/完成文件处理时执行,因此在您的情况下它们是方便的挂钩。

于 2012-11-02T14:57:10.200 回答
0

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
于 2012-11-02T15:30:39.597 回答