将文件中的字符串替换为另一个具有awk的文件中的特定字段值
我的文件1看起来像:将文件中的字符串替换为另一个具有awk的文件中的特定字段值,awk,replace,Awk,Replace,我的文件1看起来像: bla bla bla STRING_1 blabla STRING_2. bla bla bla bla bla. 我的文件2看起来像(选项卡分隔): 我试图用文件2中相应的字段替换文件1中的STRING_1和STRING_2,并输出两个不同的文件,其名称如下: 输出1: 输出2: 我尝试的是: awk -F '\t' ' NR==FNR{ if(NR>1){ a[NR]=$1 b[NR]=$2 c[NR]=$3
bla bla bla STRING_1 blabla STRING_2.
bla bla bla bla bla.
我的文件2看起来像(选项卡分隔):
我试图用文件2中相应的字段替换文件1中的STRING_1
和STRING_2
,并输出两个不同的文件,其名称如下:
输出1:
输出2:
我尝试的是:
awk -F '\t' '
NR==FNR{
if(NR>1){
a[NR]=$1
b[NR]=$2
c[NR]=$3
next
}
}
{
for(i=1; i<=FNR; i++){
gsub(/STRING_1/,bi])
gsub(/STRING_2/,c[i])
print $0 > a[i]
}
}
' file2.tab file1.tab
任何帮助都将不胜感激。
谢谢
注意:file1是唯一的模板文件,其内容不会更改 以下是如何实现使用未经测试的gsub()s的方法:
awk '
NR==FNR {
if (NR>1) {
files[$1]
for (i=2; i<=NF; i++) {
map[$1,i-1] = $i
}
}
next
}
{
for (file in files) {
rec = $0
gsub(/STRING_1/,map[file,1],rec)
gsub(/STRING_2/,map[file,2],rec)
print rec > file
}
}
' file2 file2
awk'
NR==FNR{
如果(NR>1){
档案[$1]
对于(i=2;i文件
}
}
'文件2文件2
请注意,如果字符串_1等可以包含regexp元字符,或者替换的元字符可以包含反向引用(
&
),或者如果可以进行部分匹配(在中替换的
,然后
),则此方法将出现问题。您可能还需要关闭()如果您有许多输出文件,并且没有使用GNU awk,则在运行过程中使用>
写入输出文件。GNUawk
解决方案:
awk 'NR==FNR{
if (NR==1) next;
c=0; f[$1][++c]=$2; f[$1][++c]=$3; next
}
{
c=0;
for (i in f) {
b[++c]=$0;
gsub(/STRING_1/, f[i][1], b[c]);
gsub(/STRING_2/, f[i][2], b[c]);
print b[c] > i
}
}' file2 file1
-多维数组f[$1][++c]
,其中f
是父键(例如$1
),并且out1
指向有序字段编号(即++c
和1
)2
-迭代输出文件名用于(f中的i)
$ head out[12]
==> out1 <==
bla bla bla ABCDEF blabla GHIJKL.
bla bla bla bla bla.
==> out2 <==
bla bla bla MNOPQR blabla STUVWX.
bla bla bla bla bla.
$head out[12]
==>out1out2@EdMorton,不用它试一下,你会发现不,没关系,我不想试一下。
bla bla bla FIELD_1 blabla FIELD_2.
bla bla bla bla bla.
awk '
NR==FNR {
if (NR>1) {
files[$1]
for (i=2; i<=NF; i++) {
map[$1,i-1] = $i
}
}
next
}
{
for (file in files) {
rec = $0
gsub(/STRING_1/,map[file,1],rec)
gsub(/STRING_2/,map[file,2],rec)
print rec > file
}
}
' file2 file2
awk 'NR==FNR{
if (NR==1) next;
c=0; f[$1][++c]=$2; f[$1][++c]=$3; next
}
{
c=0;
for (i in f) {
b[++c]=$0;
gsub(/STRING_1/, f[i][1], b[c]);
gsub(/STRING_2/, f[i][2], b[c]);
print b[c] > i
}
}' file2 file1
$ head out[12]
==> out1 <==
bla bla bla ABCDEF blabla GHIJKL.
bla bla bla bla bla.
==> out2 <==
bla bla bla MNOPQR blabla STUVWX.
bla bla bla bla bla.