通过record1(field2)替换record1(field1) - >在fileB中

时间:2012-02-07 04:17:16

标签: bash awk

我的问题可能不太清楚......所以让我们来样本数据...
的fileA
162,400
174402个
175404个
187,406

FILEB
E-J1-N5,319319,240248,364364,的 162162
F-J6-N1,380380,250250,360360,的 162174
E-J6-N2,380380,240240,364374, 175187

通缉输出
E-J1-N5,319319,240248,364364,的 400400
F-J6-N1,380380,250250,360360,的 400402
E-J6-N2,380380,240240,364374, 404406

所以我需要用field2(fileA)替换所有出现的field1(fileA),但是在另一个文件fileB(field $ 5)中。

这是我可以工作的。存储在两个变量中:recordx(field1)和recordx(field2)。我的NOT代码:

#!/bin/bash
for record in fileA
   do
        field1=`cut -d, -f 1 $record`
        field2=`cut -d, -f 2 $record`
        awk -v var1=$field1 -v var2=$field2 -F, '{sub(/var1/,"var2",$5);print}' fileB

   done

我收到错误:
awk:无法打开175(没有这样的文件或目录)

为什么awk试图打开一个变量? 我是朝着一个好方向前进的吗?

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

awk救援

awk 'NR==FNR{
       a[$1]=$2
       next
     }
     {
       match($5,/(...)(...)/,b)
       $5=a[b[1]] a[b[2]]
     }1' FS="," OFS="," fileA fileB

输出

$ awk 'NR==FNR{a[$1]=$2;next}{match($5,/(...)(...)/,b);$5=a[b[1]] a[b[2]]}1' FS="," OFS="," fileA >
E-J1-N5,319319,240248,364364,400400
F-J6-N1,380380,250250,360360,400402
E-J6-N2,380380,240240,364374,404406

答案 1 :(得分:0)

这可能适合你(虽然它是sed而不是像awk解决方案那样优雅):

sed '/^...,/{H;d};G;G;s/\(...\)\(...\)\n.*\n\1,\(...\).*\n\2,\(...\).*/\3\4/' file{A,B}
E-J1-N5,319319,240248,364364,400400
F-J6-N1,380380,250250,360360,400402
E-J6-N2,380380,240240,364374,404406
  • 将第一个文件(fileA)记录到保留空间(HS),然后将其删除。
  • 遇到第二个文件(fileB)的记录时,将HS两次附加到模式空间(PS)。
  • 使用最后两位三位数字作为查找附加HS中数字的键。

N.B。这假设将替换fileB的字段5中的所有数字。如果只有一些,那么查找/替换需要分成两个操作。