Bash:在保留行顺序的同时替换列的值。

Bash: Replace values of a column while retaining line order.

我有一个约 19.000 行的文件 FILE1,格式如下:

PAAXXXX PAAXXXX 0 0 1 -9
PAAXXXY PAAXXXY 0 0 1 -9
PAAXXYX PAAXXYX 0 0 2 -9
PAAXYXX PAAXYXX 0 0 2 -9
PAAYXXX PAAYXXX 0 0 1 -9
PAAYYXX PAAYYXX 0 0 1 -9
PAAYYYX PAAYYYX 0 0 2 -9
PAAAAAB PAAAAAB 0 0 1 -9

第 1 列和第 2 列中的 ID 在每种情况下都相同,第 3 列和第 4 列始终为 0,第 5 列为 1 或 2,第 6 列始终为 -9。

我还有两个文件,FILE2 和 FILE3,它们只包含 ID,不重叠。例如:

head -3 FILE2
    PAAXXYX 
    PAAXYXX
    PAAYXXX

head -2 FILE3
    PAAYYYX
    PAAAAAB

我想根据 col1 或 col2 与文件 2 和 3 中 ID 的重叠来更改 FILE1 中 col6 的值。具体来说,我想为 FILE2 中找到的所有 ID 将 1 分配给第 6 列,并且2 用于在 FILE3 中找到的所有 ID。因此,我的最终输出可能看起来像这样:

PAAXXXX PAAXXXX 0 0 1 -9
PAAXXXY PAAXXXY 0 0 1 -9
PAAXXYX PAAXXYX 0 0 2 1
PAAXYXX PAAXYXX 0 0 2 1
PAAYXXX PAAYXXX 0 0 1 1
PAAYYXX PAAYYXX 0 0 1 -9
PAAYYYX PAAYYYX 0 0 2 2
PAAAAAB PAAAAAB 0 0 1 2

请注意,如果FILE1中的某些ID在FILE2或FILE3中均未找到,我想保留原始值。此外,重要的是不要改变输出的顺序。分两步解决问题就好了,先比较FILE1和FILE2,再比较FILE1和FILE3。

我觉得我的问题可能会通过 运行 在 for 循环中使用 sed 来解决,但到目前为止我还没有成功。非常感谢您的帮助。

在 awk 中,使用 ARGIND

awk 'ARGIND~"1|2"{a[]=ARGIND;next}a[]{$NF=a[]}1' FILE2 FILE3 FILE1

PAAXXXX PAAXXXX 0 0 1 -9
PAAXXXY PAAXXXY 0 0 1 -9
PAAXXYX PAAXXYX 0 0 2 1
PAAXYXX PAAXYXX 0 0 2 1
PAAYXXX PAAYXXX 0 0 1 1
PAAYYXX PAAYYXX 0 0 1 -9
PAAYYYX PAAYYYX 0 0 2 2
PAAAAAB PAAAAAB 0 0 1 2