需要帮助替换Unix中另一个文件中的一部分列替换文件中的特定列

时间:2012-07-10 22:48:39

标签: bash shell unix sed awk

我有两个输入文件

File1:

ABC:client1:project1
XYZ:client2-aa:project2
DEF:client4:proj

File2:

client1:W-170:xx
client2-aa:WT-04:yy
client4:L-005A:zz

此外,有效值数组可以像[W,WT]

一样进行硬编码

输出:

ABC:W:project1
XYZ:WT:project2

所以基本上,如果file1的column2匹配file2中任何记录的column1,那么将file2中的coulmn2替换为file2中column2的一部分。 要获得此部分,我需要使用“ - ”运算符拆分file2中的column2,并将结果与​​数组匹配以确定有效值。

对于不符合上述标准的记录,它们不应显示在输出中。

我是shell脚本的新手,所以非常感谢任何帮助。 我已经尝试了几天,并且已经能够使用

替换整个列
awk -F":" 'NR==FNR{A[$1]=$2;next}$2 in A{$2=A[$2]}1' OFS=":" file2 file1. 

但是,无法使列要求的一部分工作。

2 个答案:

答案 0 :(得分:2)

你非常接近。以下是您要查找的awk代码,使用split函数:

awk '
  BEGIN { OFS=FS=":" } 
  NR==FNR { split ($2,one,"-"); two[$1] = one[1]; next } 
  $2 in two { $2 = two[$2]; print }
' file2 file1

输出:

ABC:W:project1
XYZ:WT:project2
DEF:L:proj

答案 1 :(得分:0)

这可能适合你(GNU sed):

sed 's/^\([^:]*:\)\([^-]*\).*/s|:\1|:\2:|p/' file2 | sed -nf - file1

说明:

  • sed 's/^\([^:]*:\)\([^-]*\).*/s|:\1|:\2:|p/' file2制作一个替代的sed脚本。
  • sed -nf - file1将其传递到另一个sed实例并针对目标文件
  • 运行

N.B。我不明白"Also, array of valid values can be hardcoded like [W,WT]"所以这可能不完全符合您的需求。