Bash 将记录1(字段1)替换为记录1(字段2)——>;在文件B中

Bash 将记录1(字段1)替换为记录1(字段2)——>;在文件B中,bash,awk,Bash,Awk,我的问题可能不太清楚。。。让我们来看看样本数据… 文件a 162400 174402 175404 187406 文件b E-J1-N5319319240248364364,162162 F-J6-N1380380250360360,162174 E-J6-N23808240364374,175187 想要的输出 E-J1-N5319319240248364364,400400 F-J6-N1380380250360360,400402 E-J6-N23808240364374,404406 所

我的问题可能不太清楚。。。让我们来看看样本数据…
文件a
162400
174402
175404
187406

文件b
E-J1-N5319319240248364364,162162
F-J6-N1380380250360360,162174
E-J6-N23808240364374,175187

想要的输出
E-J1-N5319319240248364364,400400
F-J6-N1380380250360360,400402
E-J6-N23808240364374,404406

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

以下是我认为可行的方法。存储在两个变量中:recordx(字段1)和recordx(字段2)。我的非工作代码:

#!/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试图打开一个变量? 我的方向正确吗


任何帮助都将不胜感激

awk
救援

awk 'NR==FNR{
       a[$1]=$2
       next
     }
     {
       match($5,/(...)(...)/,b)
       $5=a[b[1]] a[b[2]]
     }1' FS="," OFS="," fileA fileB
输出 这可能适合您(尽管它是sed的,没有awk解决方案那么优雅):

  • 将第一个文件(fileA)记录填充到保留空间(HS),然后删除它们
  • 当遇到第二个文件(fileB)的记录时,将HS追加两次到模式空间(PS)
  • 使用最后两个三位数字作为键查找附加HS中的数字

注意:这假设文件B字段5中的所有数字都将被替换。如果只有一些,则需要将查找/替换分为两个操作。

谢谢您的帮助!我发现您的命令有一个错误:awk:line 1:syntax error at或near,@Chargaff看起来您没有
GNU-awk
。你在使用Mac OS还是Solaris?@Jaypal是的!通过gawk,它工作得非常漂亮!你的台词太棒了!非常感谢!
$ 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
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