繁体   English   中英

用Shell脚本中的另一个文本文件中的值替换特定行?

[英]Replace specific rows with values from another text file in shell scripting?

我有一个文件,它是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行使用其值填充,其余为*,依此类推。

不知道如何在shell中轻松地做到这一点,但是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的长度,即给定的参数数。

BEGINFILE和ENDFILE块在开始/结束文件处理时执行,因此它们很方便。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM