如何使用每一行替换其他文件中的字符串来迭代文件的每一行,每次创建一个新文件

如何使用每一行替换其他文件中的字符串来迭代文件的每一行,每次创建一个新文件

我有文件 1,其中包含:

AAAAAA
BBBBBB

我有文件 2,其中包含:

11111 22222 33333

文件 3 包含:

22222 11111 33333

我想将文件 1 中的每一行插入到文件 2 和 3 中,替换“11111”并每次创建一个新文件。所以最终结果是4个文件:

文件一:

AAAAAA2222233333

文件2:

BBBBBB2222233333

文件3:

22222AAAAAA33333

文件4:

22222BBBBBB33333

我尝试使用嵌套的 for 循环和 sed 来替换值,目前我有这个;但是,它不起作用:(目录/*包含文件2和文件3)

FILES=/directory/*
cat file1 | while read line ;do
    for f in $FILES; do

            cat $f | sed 's/11111/$i/g' > newfiles/$f$i.txt

    done

done

每次运行脚本时,可能有不同数量的文件需要编辑,因此我想迭代目录以确保覆盖所有文件。文件 1 中也会有不同数量的字符串。

答案1

您需要迭代替换文件,然后循环目标文件。我想你已经快到了。我有类似以下内容的内容(我替换了一些文件名,以便通配符起作用):

!/bin/bash

i=1
FILES=./other_file*
while read r; do
    for f in $FILES; do
        sed "s/11111/$r/g" > newfiles/file$i.txt < $f
        i=$(( i + 1 ))
    done
done <file1

这里我们首先表明我们使用 bash 作为 shell。然后将计数器设置i为 1。接下来将glob文件放入变量中。循环遍历 file1 并将每一行分配给变量r。然后,对于每个文件,将11111字符串与我们在该行中看到的任何内容相匹配。使用名称中的计数器将其输出到新文件,然后递增计数器。重复直到循环完成。

答案2

那么awk呢?将映射保存file1到关联数组中,然后循环遍历其他文件的每一行的数组:

awk -v OFS= '
  NR==FNR {t[NR]=$0; next} 
  {s = $0} 
  {
    for(i in t) {
      $0 = s; 
      sub(/11111/,t[i]); 
      $1=$1; 
      print > "newfile" ++n
    }
  }' file1 file2 file3

OFS=$1=$1只是强制使用空字段分隔符重新评估记录,以删除字段之间的空格)。结果:

$ head newfile*
==> newfile1 <==
AAAAAA2222233333

==> newfile2 <==
BBBBBB2222233333

==> newfile3 <==
22222AAAAAA33333

==> newfile4 <==
22222BBBBBB33333

答案3

我使用下面的脚本来实现相同的目的

for i in `cat mainfile`; do sed "s/11111/$i/g" file1 |sed -r "s/\s+//g" >file1_$i; sed "s/11111/$i/g" file2|sed -r "s/\s+//g" >file2_$i;done

输出

请找到所有 4 个文件的输出

AAAAAA2222233333
============================
BBBBBB2222233333
============================
22222AAAAAA33333
============================
22222BBBBBB33333
==========================

==

相关内容