我有文件 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
==========================
==