我的文件1看起来像:
bla bla bla STRING_1 blabla STRING_2.
bla bla bla bla bla.
我的文件2看起来像(以标签分隔):
FILENAME FIELD_1 FIELD_2
out1 ABCDEF GHIJKL
out2 MNOPQR STUVWX
我正在尝试将file1中的STRING_1
和STRING_2
替换为file2中的相应字段,并输出2个不同的文件,其名称如下所示:
OUT1:
bla bla bla ABCDEF blabla GHIJKL.
bla bla bla bla bla.
OUT2:
bla bla bla MNOPQR blabla STUVWX.
bla bla bla bla bla.
我尝试了什么:
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
此命令仅创建包含以下内容的文件“FILENAME”:
bla bla bla FIELD_1 blabla FIELD_2.
bla bla bla bla bla.
任何帮助将不胜感激。 谢谢!
注意:file1是一个唯一的模板文件,其内容不会更改。
答案 0 :(得分:1)
以下是如何实现使用gsub()的方法,未经测试:
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
请注意,如果STRING_1等可以包含regexp元字符,或者替换的可以包含反向引用(&
),或者如果可以进行部分匹配(the
替换,则此方法会出现问题then
)。您可能还需要在出发时关闭()输出文件,如果您有许多输出文件并且没有使用GNU awk,请使用>>
写入它们。
答案 1 :(得分:0)
GNU awk
解决方案:
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}}和1
)2
- 迭代输出文件名 查看结果:
for (i in f)