unix 根据来自另一个文件的匹配更新文件的行

uklbhaso  于 4个月前  发布在  Unix
关注(0)|答案(1)|浏览(37)

我试图使用引用ref文件的第二列作为匹配条件,并更改另一个main文件的第一列,以匹配关键字的行。更新文件写入out。下面是一个例子。我的shell脚本不工作。我感谢你的帮助。

ref

PSHELL       216  136738 
PSHELL       217  136738 
PSHELL      1786   13571 
PSHELL      1605  136513

字符串
联系我们

PSHELL       216  136738 
PSHELL       218  136738 
PSHELL      1786   13571 
PSHELL      1610  136513
PSHELL      1612  136513


出去

+PSHELL       216  136738 
PSHELL       218  136738 
+PSHELL      1786   13571 
PSHELL      1610  136513
PSHELL      1612  136513

我的代码

awk '
  FNR == NR {                         # if record from 1st file
    item[++n] = $2                    # store in indexed item array
    next                              # skip to next record
  }
  { main[++m] = $0 }                  # for 2nd file, store record in main
  END {                               # after all records processed
    for (i=1; i<=n; i++)              # loop over all items
      for(j=1; j<=m; j++) {           # loop over each record in main
        line = main[j]                # save record in line
        if (j == 2)                   # if 2nd record in main
          [$2]=+[$2]
        print line >> item[i]         # append line to item file 
      }
  }
' ref main > out

Error第11行:错误

ehxuflar

ehxuflar1#

[$2]=+[$2]不是有效的awk语法。在这种情况下,没有理由在解析第二个文件后等待(main)来打印END块中的输出。你可以在解析main时动态打印。无论如何,对于这种处理,你应该使用关联数组而不是索引数组,in操作符测试一个元素是否是item的键:

awk 'FNR==NR {item[$2]; next} $2 in item {printf("+")} 1' ref main > out

字符串
变量:您也可以有条件地修改$0

awk 'FNR==NR {item[$2]; next} {$0=($2 in item?"+":"")$0; print}' ref main > out

相关问题